File Coverage

gen/attr-PerlBean_Attribute_Multi_Unique_Associative.pl
Criterion Covered Total %
statement 6 6 100.0
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 8 8 100.0


line stmt bran cond sub pod time code
1 1     1   5 use strict;
  1         2  
  1         253  
2              
3             push(@::bean_desc, {
4             bean_opt => {
5             abstract => 'Unique, associative MULTI bean attribute information',
6             package => 'PerlBean::Attribute::Multi::Unique::Associative',
7             use_perl_version => 5.005,
8             base => [ qw(PerlBean::Attribute::Multi)],
9             description => <
10             C contains unique associative MULTI bean attribute information. It is a subclass of C. The code generation and documentation methods from C are implemented.
11             EOF
12             short_description => 'contains unique associative MULTI bean attribute information',
13             synopsis => &get_syn(),
14             },
15             attr_opt => [
16             ],
17             meth_opt => [
18             {
19             method_name => 'create_method_add',
20             documented => 0,
21             body => <<'THE_EOF',
22             my $self = shift;
23              
24             my $an = $self->get_method_factory_name();
25             my $an_esc = $self->_esc_apos($an);
26             my $op = &{$MOF}('add');
27             my $mb = $self->get_method_base();
28             my $ec = $self->get_exception_class();
29             my $pkg = $self->get_package();
30             my $pkg_us = $self->get_package_us();
31             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
32             my $exc = ' On error an exception C<' . $self->get_exception_class() . '> is thrown.';
33              
34             # Make body
35             my $body = <
36             ${IND}my \$self${AO}=${AO}shift;
37              
38             EOF
39              
40             # Separate keys/values
41             $body .= <
42             ${IND}# Separate keys/values
43             ${IND}my \@key${AO}=${AO}();
44             ${IND}my \@value${AO}=${AO}();
45             ${IND}while${BCP}(${ACS}my \$key${AO}=${AO}shift${BFP}(\@_)${ACS})${PBOC[1]}{
46             ${IND}${IND}push${BFP}(${ACS}\@key,${AC}\$key${ACS});
47             ${IND}${IND}push${BFP}(${ACS}\@value,${AC}shift${BFP}(\@_)${ACS});
48             ${IND}}
49              
50             EOF
51              
52             # Check if isas/refs/rxs/values are allowed
53             $body .= <
54             ${IND}# Check if isas/refs/rxs/values are allowed
55             ${IND}\&_value_is_allowed${BFP}(${ACS}$an_esc,${AC}\@value${ACS})${AO}||${AO}throw $ec${BFP}("ERROR: ${pkg}::$op$mb, one or more specified value(s) '\@value' is/are not allowed.");
56              
57             EOF
58              
59             # Method tail
60             $body .= <
61             ${IND}# Add keys/values
62             ${IND}foreach my \$key (\@key)${PBOC[1]}{
63             ${IND}${IND}\$self->{$pkg_us}{$an}{\$key}${AO}=${AO}shift${BFP}(\@value);
64             ${IND}}
65             EOF
66              
67             # Make description
68             my $description = <
69             Add additional keys/values on ${desc}. C are key/value pairs. The addition may not yield to multiple identical keys in the list. Hence, multiple occurrences of the same key cause the last occurrence to be inserted.${exc}
70             EOF
71              
72             # Add clauses to the description
73             my $clauses = $self->mk_doc_clauses();
74             if ($clauses) {
75             $description .= "\n" . $clauses;
76             }
77              
78             # Create and return the method
79             return( PerlBean::Method->new( {
80             method_name => "$op$mb",
81             parameter_description => "${ACS}\[${ACS}KEY, VALUE ...${ACS}]${ACS}",
82             documented => $self->is_documented(),
83             volatile => 1,
84             description => $description,
85             body => $body,
86             } ) );
87             THE_EOF
88             },
89             {
90             method_name => 'create_method_delete',
91             documented => 0,
92             body => <<'THE_EOF',
93             my $self = shift;
94              
95             my $an = $self->get_method_factory_name();
96             my $an_esc = $self->_esc_apos($an);
97             my $op = &{$MOF}('delete');
98             my $mb = $self->get_method_base();
99             my $ec = $self->get_exception_class();
100             my $pkg = $self->get_package();
101             my $pkg_us = $self->get_package_us();
102             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
103             my $empt = $self->is_allow_empty() ? '' : ' After deleting at least one element must remain.';
104             my $exc = ' On error an exception C<' . $self->get_exception_class() . '> is thrown.';
105              
106             # Make body
107             my $body = <
108             ${IND}my \$self${AO}=${AO}shift;
109              
110             EOF
111              
112             # Check if list value is allowed to be empty
113             if ( ! $self->is_allow_empty() ) {
114             $body .= <
115             ${IND}# List value for $an_esc is not allowed to be empty
116             ${IND}my \%would_delete${AO}=${AO}();
117             ${IND}foreach my \$val (\@_)${PBOC[1]}{
118             ${IND}${IND}\$would_delete{\$val}${AO}=${AO}\$val if${BCP}(${ACS}exists${BFP}(${ACS}\$self->{$pkg_us}{$an}{\$val}${ACS})${ACS})
119             ${IND}}
120             ${IND}(${ACS}scalar${BFP}(${ACS}keys${BFP}(${ACS}\%{${ACS}\$self->{$pkg_us}{$an}${ACS}}${ACS})${ACS})${AO}==${AO}scalar${BFP}(${ACS}keys${BFP}(${ACS}\%would_delete)${ACS})${ACS})${AO}&&${AO}throw $ec${BFP}("ERROR: ${pkg}::$op$mb, list value may not be empty.");
121              
122             EOF
123             }
124              
125             # Method tail
126             $body .= <
127             ${IND}# Delete values
128             ${IND}my \$del${AO}=${AO}0;
129             ${IND}foreach my \$val (\@_)${PBOC[1]}{
130             ${IND}${IND}exists${BFP}(${ACS}\$self->{$pkg_us}{$an}{\$val}${ACS})${AO}||${AO}next;
131             ${IND}${IND}delete${BFP}(${ACS}\$self->{$pkg_us}{$an}{\$val}${ACS});
132             ${IND}${IND}\$del${AO}++;
133             ${IND}}
134             ${IND}return${BFP}(\$del);
135             EOF
136              
137             # Create and return the method
138             return( PerlBean::Method->new( {
139             method_name => "$op$mb",
140             parameter_description => 'ARRAY',
141             documented => $self->is_documented(),
142             volatile => 1,
143             description => <
144             Delete elements from ${desc}.${empt} Returns the number of deleted elements.${exc}
145             EOF
146             body => $body,
147             } ) );
148             THE_EOF
149             },
150             {
151             method_name => 'create_method_exists',
152             documented => 0,
153             body => <<'THE_EOF',
154             my $self = shift;
155              
156             my $an = $self->get_method_factory_name();
157             my $op = &{$MOF}('exists');
158             my $mb = $self->get_method_base();
159             my $pkg_us = $self->get_package_us();
160             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
161              
162             # Make body
163             my $body = <
164             ${IND}my \$self${AO}=${AO}shift;
165              
166             ${IND}# Count occurrences
167             ${IND}my \$count${AO}=${AO}0;
168             ${IND}foreach my \$val (\@_)${PBOC[1]}{
169             ${IND}${IND}\$count${AO}+=${AO}exists${BFP}(${ACS}\$self->{$pkg_us}{$an}{\$val}${ACS});
170             ${IND}}
171             ${IND}return${BFP}(\$count);
172             EOF
173              
174             # Create and return the method
175             return( PerlBean::Method->new( {
176             method_name => "$op$mb",
177             parameter_description => 'ARRAY',
178             documented => $self->is_documented(),
179             volatile => 1,
180             description => <
181             Returns the count of items in C that are in ${desc}.
182             EOF
183             body => $body,
184             } ) );
185             THE_EOF
186             },
187             {
188             method_name => 'create_method_keys',
189             documented => 0,
190             body => <<'THE_EOF',
191             my $self = shift;
192              
193             my $an = $self->get_method_factory_name();
194             my $op = &{$MOF}('keys');
195             my $mb = $self->get_method_base();
196             my $pkg_us = $self->get_package_us();
197             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
198              
199             # Make body
200             my $body = <
201             ${IND}my \$self${AO}=${AO}shift;
202              
203             ${IND}# Return all keys
204             ${IND}return${BFP}(${ACS}keys${BFP}(${ACS}\%{${ACS}\$self->{$pkg_us}{$an}${ACS}}${ACS})${ACS});
205             EOF
206              
207             # Create and return the method
208             return( PerlBean::Method->new( {
209             method_name => "$op$mb",
210             documented => $self->is_documented(),
211             volatile => 1,
212             description => <
213             Returns an C containing the keys of ${desc}.
214             EOF
215             body => $body,
216             } ) );
217             THE_EOF
218             },
219             {
220             method_name => 'create_method_set',
221             documented => 0,
222             body => <<'THE_EOF',
223             my $self = shift;
224              
225             my $an = $self->get_method_factory_name();
226             my $an_esc = $self->_esc_apos($an);
227             my $op = &{$MOF}('set');
228             my $mb = $self->get_method_base();
229             my $ec = $self->get_exception_class();
230             my $pkg = $self->get_package();
231             my $pkg_us = $self->get_package_us();
232             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
233             my $def = defined( $self->get_default_value() ) ? ' Default value at initialization is C<' . join( ', ', $self->_esc_aq ( @{ $self->get_default_value() } ) ) . '>.' : '';
234             my $empt = $self->is_allow_empty() ? '' : ' C must at least have one element.';
235             my $exc = ' On error an exception C<' . $self->get_exception_class() . '> is thrown.';
236             my $attr_overl = $self->_get_overloaded_attribute();
237             my $overl = defined($attr_overl) ? " B Methods B> are overloaded from package C<". $attr_overl->get_package() .'>.': '';
238              
239             # Make body
240             my $body = <
241             ${IND}my \$self${AO}=${AO}shift;
242              
243             EOF
244              
245             # Check if list value is allowed to be empty
246             if ( ! $self->is_allow_empty() ) {
247             $body .= <
248             ${IND}# List value for $an_esc is not allowed to be empty
249             ${IND}scalar${BFP}(\@_)${AO}||${AO}throw $ec${BFP}("ERROR: ${pkg}::$op$mb, list value may not be empty.");
250              
251             EOF
252             }
253              
254             # Separate keys/values
255             $body .= <
256             ${IND}# Separate keys/values
257             ${IND}my \@key${AO}=${AO}();
258             ${IND}my \@value${AO}=${AO}();
259             ${IND}while${BCP}(${ACS}my \$key${AO}=${AO}shift${BFP}(\@_)${ACS})${PBOC[1]}{
260             ${IND}${IND}push${BFP}(${ACS}\@key,${AC}\$key${ACS});
261             ${IND}${IND}push${BFP}(${ACS}\@value,${AC}shift${BFP}(\@_)${ACS});
262             ${IND}}
263              
264             EOF
265              
266             # Check if isas/refs/rxs/values are allowed
267             $body .= <
268             ${IND}# Check if isas/refs/rxs/values are allowed
269             ${IND}\&_value_is_allowed${BFP}(${ACS}$an_esc,${AC}\@value${ACS})${AO}||${AO}throw $ec${BFP}("ERROR: ${pkg}::$op$mb, one or more specified value(s) '\@value' is/are not allowed.");
270              
271             EOF
272              
273             # Method tail
274             $body .= <
275             ${IND}# Empty list
276             ${IND}\$self->{$pkg_us}{$an}${AO}=${AO}\{};
277              
278             ${IND}# Add keys/values
279             ${IND}foreach my \$key (\@key)${PBOC[1]}{
280             ${IND}${IND}\$self->{$pkg_us}{$an}{\$key}${AO}=${AO}shift${BFP}(\@value);
281             ${IND}}
282             EOF
283              
284             # Make description
285             my $description = <
286             Set ${desc} absolutely using keys/values. C are key/value pairs. 0 or more of these pairs may be supplied. Each key in is allowed to occur only once. Multiple occurrences of the same key yield in the last occurring key to be inserted and the rest to be ignored.${def}${empt}${exc}${overl}
287             EOF
288              
289             # Add clauses to the description
290             my $clauses = $self->mk_doc_clauses();
291             if ($clauses) {
292             $description .= "\n" . $clauses;
293             }
294              
295             # Create and return the method
296             return( PerlBean::Method->new( {
297             method_name => "$op$mb",
298             parameter_description => "${ACS}\[${ACS}KEY, VALUE ...${ACS}]${ACS}",
299             documented => $self->is_documented(),
300             volatile => 1,
301             description => $description,
302             body => $body,
303             } ) );
304             THE_EOF
305             },
306             {
307             method_name => 'create_method_values',
308             documented => 0,
309             body => <<'THE_EOF',
310             my $self = shift;
311              
312             my $an = $self->get_method_factory_name();
313             my $op = &{$MOF}('values');
314             my $mb = $self->get_method_base();
315             my $pkg_us = $self->get_package_us();
316             my $desc = defined( $self->get_short_description() ) ? $self->get_short_description() : 'not described option';
317              
318             # Make body
319             my $body = <
320             ${IND}my \$self${AO}=${AO}shift;
321              
322             ${IND}if${BCP}(${ACS}scalar${BFP}(\@_)${ACS})${PBOC[1]}{
323             ${IND}${IND}my \@ret${AO}=${AO}();
324             ${IND}${IND}foreach my \$key (\@_)${PBOC[2]}{
325             ${IND}${IND}${IND}exists${BFP}(${ACS}\$self->{$pkg_us}{$an}{\$key}${ACS})${AO}&&${AO}push${BFP}(${ACS}\@ret,${AC}\$self->{$pkg_us}{$an}{\$key}${ACS});
326             ${IND}${IND}}
327             ${IND}${IND}return${BFP}(\@ret);
328             ${IND}}${PBCC[1]}else${PBOC[1]}{
329             ${IND}${IND}# Return all values
330             ${IND}${IND}return${BFP}(${ACS}values${BFP}(${ACS}\%{${ACS}\$self->{$pkg_us}{$an}${ACS}}${ACS})${ACS});
331             ${IND}}
332             EOF
333              
334             # Create and return the method
335             return( PerlBean::Method->new( {
336             method_name => "$op$mb",
337             parameter_description => "${ACS}\[${ACS}KEY_ARRAY${ACS}]${ACS}",
338             documented => $self->is_documented(),
339             volatile => 1,
340             description => <
341             Returns an C containing the values of ${desc}. If C contains one or more Cs the values related to the Cs are returned. If no Cs specified all values are returned.
342             EOF
343             body => $body,
344             } ) );
345             THE_EOF
346             },
347             {
348             method_name => 'create_methods',
349             description => <
350             __SUPER_POD__ Access methods are B, B, B, B, B and B.',
351             EOF
352             body => <<'EOF',
353             my $self = shift;
354              
355             return(
356             $self->create_method_add(),
357             $self->create_method_delete(),
358             $self->create_method_exists(),
359             $self->create_method_keys(),
360             $self->create_method_set(),
361             $self->create_method_values(),
362             );
363             EOF
364             },
365             ],
366             sym_opt => [
367             ],
368             use_opt => [
369             {
370             dependency_name => 'PerlBean::Style',
371             import_list => [ 'qw(:codegen)' ],
372             },
373             ],
374             } );
375              
376             sub get_syn {
377 1     1   4 use IO::File;
  1         2  
  1         170  
378             my $fh = IO::File->new('< syn-PerlBean_Attribute_Multi_Unique_Associative.pl');
379             $fh = IO::File->new('< gen/syn-PerlBean_Attribute_Multi_Unique_Associative.pl') if (! defined($fh));
380             my $syn = '';
381             my $prev_line = $fh->getline ();
382             while (my $line = $fh->getline ()) {
383             $syn .= ' ' . $prev_line;
384             $prev_line = $line;
385             }
386             return($syn);
387             }
388              
389             1;