File Coverage

blib/lib/Venus/Atom.pm
Criterion Covered Total %
statement 30 32 93.7
branch 3 4 75.0
condition 7 14 50.0
subroutine 12 13 92.3
pod 1 1 100.0
total 53 64 82.8


line stmt bran cond sub pod time code
1             package Venus::Atom;
2              
3 1     1   22 use 5.018;
  1         3  
4              
5 1     1   5 use strict;
  1         1  
  1         21  
6 1     1   36 use warnings;
  1         4  
  1         36  
7              
8 1     1   5 use Venus::Class 'base';
  1         2  
  1         6  
9              
10             base 'Venus::Sealed';
11              
12             use overload (
13 4   100 4   635 '""' => sub{$_[0]->get // ''},
14 0   0 0   0 '~~' => sub{$_[0]->get // ''},
15 2   50 2   16 'eq' => sub{($_[0]->get // '') eq "$_[1]"},
16 2   100 2   15 'ne' => sub{($_[0]->get // '') ne "$_[1]"},
17 1     1   4 'qr' => sub{qr/@{[quotemeta($_[0])]}/},
  1         5  
18 1         21 fallback => 1,
19 1     1   7 );
  1         2  
20              
21             # METHODS
22              
23             sub __get {
24 10     10   22 my ($self, $init, $data) = @_;
25              
26 10         130 return $init->{value};
27             }
28              
29             sub __set {
30 6     6   21 my ($self, $init, $data, $value) = @_;
31              
32 6 50 33     40 if (ref $value || !defined $value || $value eq '') {
      33        
33 0         0 return undef;
34             }
35              
36 6 100       117 return $init->{value} = $value if !exists $init->{value};
37              
38 1         30 return $self->error({throw => 'error_on_set', value => $value});
39             }
40              
41             # ERRORS
42              
43             sub error_on_set {
44 2     2 1 6 my ($self, $data) = @_;
45              
46 2         8 my $message = 'Can\'t re-set atom value to "{{value}}"';
47              
48             my $stash = {
49             value => $data->{value},
50 2         6 };
51              
52 2         8 my $result = {
53             name => 'on.set',
54             raise => true,
55             stash => $stash,
56             message => $message,
57             };
58              
59 2         16 return $result;
60             }
61              
62             1;
63              
64              
65              
66             =head1 NAME
67              
68             Venus::Atom - Atom Class
69              
70             =cut
71              
72             =head1 ABSTRACT
73              
74             Atom Class for Perl 5
75              
76             =cut
77              
78             =head1 SYNOPSIS
79              
80             package main;
81              
82             use Venus::Atom;
83              
84             my $atom = Venus::Atom->new;
85              
86             # $atom->get;
87              
88             # undef
89              
90             =cut
91              
92             =head1 DESCRIPTION
93              
94             This package provides a write-once object representing a constant value.
95              
96             =cut
97              
98             =head1 INHERITS
99              
100             This package inherits behaviors from:
101              
102             L
103              
104             =cut
105              
106             =head1 METHODS
107              
108             This package provides the following methods:
109              
110             =cut
111              
112             =head2 get
113              
114             get() (any)
115              
116             The get method can be used to get the underlying constant value set during
117             instantiation.
118              
119             I>
120              
121             =over 4
122              
123             =item get example 1
124              
125             # given: synopsis
126              
127             package main;
128              
129             my $get = $atom->get;
130              
131             # undef
132              
133             =back
134              
135             =over 4
136              
137             =item get example 2
138              
139             # given: synopsis
140              
141             package main;
142              
143             $atom->set("hello");
144              
145             my $get = $atom->get;
146              
147             # "hello"
148              
149             =back
150              
151             =cut
152              
153             =head2 set
154              
155             set(any $data) (any)
156              
157             The set method can be used to set the underlying constant value set during
158             instantiation or via this method. An atom can only be set once, either at
159             instantiation of via this method. Any attempt to re-set the atom will result in
160             an error.
161              
162             I>
163              
164             =over 4
165              
166             =item set example 1
167              
168             # given: synopsis
169              
170             package main;
171              
172             my $set = $atom->set("hello");
173              
174             # "hello"
175              
176             =back
177              
178             =over 4
179              
180             =item set example 2
181              
182             # given: synopsis
183              
184             package main;
185              
186             my $set = $atom->set("hello");
187              
188             $atom->set("hello");
189              
190             # Exception! (isa Venus::Atom::Error) (see error_on_set)
191              
192             =back
193              
194             =cut
195              
196             =head1 ERRORS
197              
198             This package may raise the following errors:
199              
200             =cut
201              
202             =over 4
203              
204             =item error: C
205              
206             This package may raise an error_on_set exception.
207              
208             B
209              
210             # given: synopsis;
211              
212             my $input = {
213             throw => 'error_on_set',
214             value => 'test',
215             };
216              
217             my $error = $atom->catch('error', $input);
218              
219             # my $name = $error->name;
220              
221             # "on_set"
222              
223             # my $message = $error->render;
224              
225             # "Can't re-set atom value to \"test\""
226              
227             # my $value = $error->stash('value');
228              
229             # "test"
230              
231             =back
232              
233             =head1 OPERATORS
234              
235             This package overloads the following operators:
236              
237             =cut
238              
239             =over 4
240              
241             =item operation: C<("")>
242              
243             This package overloads the C<""> operator.
244              
245             B
246              
247             # given: synopsis;
248              
249             my $result = "$atom";
250              
251             # ""
252              
253             B
254              
255             # given: synopsis;
256              
257             $atom->set("hello");
258              
259             my $result = "$atom";
260              
261             # "hello"
262              
263             =back
264              
265             =over 4
266              
267             =item operation: C<(eq)>
268              
269             This package overloads the C operator.
270              
271             B
272              
273             # given: synopsis;
274              
275             my $result = $atom eq "";
276              
277             # 1
278              
279             B
280              
281             # given: synopsis;
282              
283             $atom->set("hello");
284              
285             my $result = $atom eq "hello";
286              
287             # 1
288              
289             =back
290              
291             =over 4
292              
293             =item operation: C<(ne)>
294              
295             This package overloads the C operator.
296              
297             B
298              
299             # given: synopsis;
300              
301             my $result = $atom ne "";
302              
303             # 0
304              
305             B
306              
307             # given: synopsis;
308              
309             $atom->set("hello");
310              
311             my $result = $atom ne "";
312              
313             # 1
314              
315             =back
316              
317             =over 4
318              
319             =item operation: C<(qr)>
320              
321             This package overloads the C operator.
322              
323             B
324              
325             # given: synopsis;
326              
327             my $test = 'hello' =~ qr/$atom/;
328              
329             # 1
330              
331             =back
332              
333             =head1 AUTHORS
334              
335             Awncorp, C
336              
337             =cut
338              
339             =head1 LICENSE
340              
341             Copyright (C) 2000, Awncorp, C.
342              
343             This program is free software, you can redistribute it and/or modify it under
344             the terms of the Apache license version 2.0.
345              
346             =cut