use Moo;
use Valiant::Util 'throw_exception';
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