—package
Valiant::Filter::ToArray;
use
Moo;
has
split_on
=> (
is
=>
'ro'
,
predicate
=>
'has_split_on'
);
sub
normalize_shortcut {
my
(
$class
,
$arg
) =
@_
;
return
+{ };
}
sub
filter_each {
my
(
$self
,
$class
,
$attrs
,
$attribute_name
) =
@_
;
my
$value
=
$attrs
->{
$attribute_name
};
return
unless
defined
$value
;
if
(
$self
->has_split_on) {
return
[
split
(
$self
->split_on,
$value
) ];
}
return
(
ref
(
$value
)||
''
) eq
'ARRAY'
?
$value
: [
$value
];
}
1;
=head1 NAME
Valiant::Filter::ToArray - Force the value into an arrayref if its not one already
=head1 SYNOPSIS
package Local::Test;
use Moo;
use Valiant::Filters;
has 'string' => (is=>'ro', required=>1);
has 'array' => (is=>'ro', required=>1);
has 'split' => (is=>'ro', required=>1);
filters ['string', 'array'] => (to_array => 1);
filters split => (to_array => +{ split_on => ',' } );
my $object = Local::Test->new(
string => 'foo',
array => ['bar', 'baz'],
split = '123',
);
$object->string; # ['foo']
$object->array; # ['bar', 'baz']
$object->split: # [1, 2, 3]
=head1 DESCRIPTION
Force any scalar values to arrayref. Basically normalize on an arrayref. Allows you
to specific a split pattern or just make the string into an arrayref
=head1 ATTRIBUTES
This filter defines the following attributes
=head2 split_on
Optional. A pattern used via C<split> to split a string into an arrayref. If not
present just use the string as is to make an arrayref.
=head1 SEE ALSO
L<Valiant>, L<Valiant::Filter>, L<Valiant::Validator::Filter>.
=head1 AUTHOR
See L<Valiant>
=head1 COPYRIGHT & LICENSE
See L<Valiant>
=cut