File Coverage

blib/lib/HTML/FormFu/Role/Element/FieldMethods.pm
Criterion Covered Total %
statement 130 156 83.3
branch 34 62 54.8
condition n/a
subroutine 19 20 95.0
pod 0 9 0.0
total 183 247 74.0


line stmt bran cond sub pod time code
1 323     323   209259 use strict;
  323         907  
  323         19261  
2              
3             package HTML::FormFu::Role::Element::FieldMethods;
4             # ABSTRACT: Role for field methods
5             $HTML::FormFu::Role::Element::FieldMethods::VERSION = '2.07';
6 323     323   2040 use Moose::Role;
  323         763  
  323         2463  
7              
8 323     323   1716412 use Carp qw( croak );
  323         1190  
  323         303250  
9              
10             sub nested_name {
11 0     0 0 0 my ($self) = @_;
12              
13 0 0       0 croak 'cannot set nested_name' if @_ > 1;
14              
15 0 0       0 return if !defined $self->name;
16              
17 0         0 my @names = $self->nested_names;
18              
19 0 0       0 if ( $self->form->nested_subscript ) {
20 0         0 my $name = shift @names;
21 0         0 map { $name .= "[$_]" } @names;
  0         0  
22              
23             # TODO - Mario Minati 19.05.2009
24             # Does this (name formatted as '[name]') collide with FF::Model::HashRef as
25             # it uses /_\d/ to parse repeatable names?
26 0         0 return $name;
27             }
28             else {
29 0         0 return join ".", @names;
30             }
31             }
32              
33             sub add_error {
34 193     193 0 812 my ( $self, @errors ) = @_;
35              
36 193         452 push @{ $self->_errors }, @errors;
  193         6104  
37              
38 193         745 return;
39             }
40              
41             sub deflator {
42 13     13 0 41 my ( $self, $arg ) = @_;
43 13         26 my @return;
44              
45 13 100       71 if ( ref $arg eq 'ARRAY' ) {
46 4         13 push @return, map { _single_deflator( $self, $_ ) } @$arg;
  4         20  
47             }
48             else {
49 9         33 push @return, _single_deflator( $self, $arg );
50             }
51              
52 13 50       79 return @return == 1 ? $return[0] : @return;
53             }
54              
55             sub filter {
56 29     29 0 97 my ( $self, $arg ) = @_;
57 29         68 my @return;
58              
59 29 100       132 if ( ref $arg eq 'ARRAY' ) {
60 12         38 push @return, map { _single_filter( $self, $_ ) } @$arg;
  12         45  
61             }
62             else {
63 17         88 push @return, _single_filter( $self, $arg );
64             }
65              
66 29 50       327 return @return == 1 ? $return[0] : @return;
67             }
68              
69             sub constraint {
70 136     136 0 538 my ( $self, $arg ) = @_;
71 136         325 my @return;
72              
73 136 100       646 if ( ref $arg eq 'ARRAY' ) {
74 56         179 push @return, map { _single_constraint( $self, $_ ) } @$arg;
  64         339  
75             }
76             else {
77 80         478 push @return, _single_constraint( $self, $arg );
78             }
79              
80 136 100       1970 return @return == 1 ? $return[0] : @return;
81             }
82              
83             sub inflator {
84 14     14 0 50 my ( $self, $arg ) = @_;
85 14         38 my @return;
86              
87 14 100       63 if ( ref $arg eq 'ARRAY' ) {
88 3         10 push @return, map { _single_inflator( $self, $_ ) } @$arg;
  3         14  
89             }
90             else {
91 11         71 push @return, _single_inflator( $self, $arg );
92             }
93              
94 14 50       168 return @return == 1 ? $return[0] : @return;
95             }
96              
97             sub validator {
98 3     3 0 10 my ( $self, $arg ) = @_;
99 3         14 my @return;
100              
101 3 50       15 if ( ref $arg eq 'ARRAY' ) {
102 0         0 push @return, map { _single_validator( $self, $_ ) } @$arg;
  0         0  
103             }
104             else {
105 3         15 push @return, _single_validator( $self, $arg );
106             }
107              
108 3 50       110 return @return == 1 ? $return[0] : @return;
109             }
110              
111             sub transformer {
112 5     5 0 18 my ( $self, $arg ) = @_;
113 5         11 my @return;
114              
115 5 50       22 if ( ref $arg eq 'ARRAY' ) {
116 0         0 push @return, map { _single_transformer( $self, $_ ) } @$arg;
  0         0  
117             }
118             else {
119 5         26 push @return, _single_transformer( $self, $arg );
120             }
121              
122 5 50       177 return @return == 1 ? $return[0] : @return;
123             }
124              
125             sub plugin {
126 1     1 0 4 my ( $self, $arg ) = @_;
127 1         2 my @return;
128              
129 1 50       5 if ( ref $arg eq 'ARRAY' ) {
130 0         0 push @return, map { _single_plugin( $self, $_ ) } @$arg;
  0         0  
131             }
132             else {
133 1         5 push @return, _single_plugin( $self, $arg );
134             }
135              
136 1 50       6 return @return == 1 ? $return[0] : @return;
137             }
138              
139             BEGIN {
140 323     323   1946 *constraints = \&constraint;
141 323         1143 *filters = \&filter;
142 323         896 *deflators = \&deflator;
143 323         947 *inflators = \&inflator;
144 323         880 *validators = \&validator;
145 323         908 *transformers = \&transformer;
146 323         241990 *plugins = \&plugin;
147             }
148              
149             sub _single_deflator {
150 13     13   35 my ( $self, $arg ) = @_;
151              
152 13 100       61 if ( !ref $arg ) {
    50          
153 1         4 $arg = { type => $arg };
154             }
155             elsif ( ref $arg eq 'HASH' ) {
156 12         63 $arg = {%$arg}; # shallow clone
157             }
158             else {
159 0         0 croak 'invalid args';
160             }
161              
162 13         35 my @return;
163              
164 13         40 my $type = delete $arg->{type};
165              
166 13         123 my $new = $self->_require_deflator( $type, $arg );
167              
168 13         28 push @{ $self->_deflators }, $new;
  13         403  
169              
170 13         59 return $new;
171             }
172              
173             sub _single_filter {
174 29     29   104 my ( $self, $arg ) = @_;
175              
176 29 100       134 if ( !ref $arg ) {
    50          
177 19         84 $arg = { type => $arg };
178             }
179             elsif ( ref $arg eq 'HASH' ) {
180 10         63 $arg = {%$arg}; # shallow clone
181             }
182             else {
183 0         0 croak 'invalid args';
184             }
185              
186 29         61 my @return;
187              
188 29         100 my $type = delete $arg->{type};
189              
190 29         289 my $new = $self->_require_filter( $type, $arg );
191              
192 29         67 push @{ $self->_filters }, $new;
  29         1005  
193              
194 29         159 return $new;
195             }
196              
197             sub _single_constraint {
198 144     144   519 my ( $self, $arg ) = @_;
199              
200 144 100       711 if ( !ref $arg ) {
    50          
201 88         359 $arg = { type => $arg };
202             }
203             elsif ( ref $arg eq 'HASH' ) {
204 56         366 $arg = {%$arg}; # shallow clone
205             }
206             else {
207 0         0 croak 'invalid args';
208             }
209              
210 144         388 my @return;
211              
212 144         443 my $type = delete $arg->{type};
213              
214 144         967 my $new = $self->_require_constraint( $type, $arg );
215              
216 144         353 push @{ $self->_constraints }, $new;
  144         5458  
217              
218 144         720 return $new;
219             }
220              
221             sub _single_inflator {
222 14     14   47 my ( $self, $arg ) = @_;
223              
224 14 100       82 if ( !ref $arg ) {
    50          
225 9         33 $arg = { type => $arg };
226             }
227             elsif ( ref $arg eq 'HASH' ) {
228 5         29 $arg = {%$arg}; # shallow clone
229             }
230             else {
231 0         0 croak 'invalid args';
232             }
233              
234 14         33 my @return;
235              
236 14         42 my $type = delete $arg->{type};
237              
238 14         140 my $new = $self->_require_inflator( $type, $arg );
239              
240 14         35 push @{ $self->_inflators }, $new;
  14         505  
241              
242 14         66 return $new;
243             }
244              
245             sub _single_validator {
246 3     3   10 my ( $self, $arg ) = @_;
247              
248 3 50       12 if ( !ref $arg ) {
    0          
249 3         10 $arg = { type => $arg };
250             }
251             elsif ( ref $arg eq 'HASH' ) {
252 0         0 $arg = {%$arg}; # shallow clone
253             }
254             else {
255 0         0 croak 'invalid args';
256             }
257              
258 3         6 my @return;
259              
260 3         11 my $type = delete $arg->{type};
261              
262 3         35 my $new = $self->_require_validator( $type, $arg );
263              
264 3         8 push @{ $self->_validators }, $new;
  3         107  
265              
266 3         13 return $new;
267             }
268              
269             sub _single_transformer {
270 5     5   15 my ( $self, $arg ) = @_;
271              
272 5 50       17 if ( !ref $arg ) {
    0          
273 5         18 $arg = { type => $arg };
274             }
275             elsif ( ref $arg eq 'HASH' ) {
276 0         0 $arg = {%$arg}; # shallow clone
277             }
278             else {
279 0         0 croak 'invalid args';
280             }
281              
282 5         9 my @return;
283              
284 5         14 my $type = delete $arg->{type};
285              
286 5         40 my $new = $self->_require_transformer( $type, $arg );
287              
288 5         10 push @{ $self->_transformers }, $new;
  5         172  
289              
290 5         21 return $new;
291             }
292              
293             sub _single_plugin {
294 1     1   3 my ( $self, $arg ) = @_;
295              
296 1 50       3 if ( !ref $arg ) {
    0          
297 1         3 $arg = { type => $arg };
298             }
299             elsif ( ref $arg eq 'HASH' ) {
300 0         0 $arg = {%$arg}; # shallow clone
301             }
302             else {
303 0         0 croak 'invalid args';
304             }
305              
306 1         3 my @return;
307              
308 1         3 my $type = delete $arg->{type};
309              
310 1         10 my $new = $self->_require_plugin( $type, $arg );
311              
312 1         3 push @{ $self->_plugins }, $new;
  1         40  
313              
314 1         6 return $new;
315             }
316              
317             1;
318              
319             __END__
320              
321             =pod
322              
323             =encoding UTF-8
324              
325             =head1 NAME
326              
327             HTML::FormFu::Role::Element::FieldMethods - Role for field methods
328              
329             =head1 VERSION
330              
331             version 2.07
332              
333             =head1 AUTHOR
334              
335             Carl Franks <cpan@fireartist.com>
336              
337             =head1 COPYRIGHT AND LICENSE
338              
339             This software is copyright (c) 2018 by Carl Franks.
340              
341             This is free software; you can redistribute it and/or modify it under
342             the same terms as the Perl 5 programming language system itself.
343              
344             =cut