};
}
+sub contains : method {
+ my ($attr, $reader, $writer) = @_;
+ return sub {
+ my ($instance, $item) = @_;
+ return scalar (defined $item ?
+ CORE::grep {defined && $_ eq $item} @{$reader->($instance)}
+ : CORE::grep {!defined} @{$reader->($instance)}
+ );
+ };
+}
+
sub join : method {
my ($attr, $reader, $writer) = @_;
return sub {
default => sub { [] },
auto_deref => 1,
provides => {
- map => 'map_options',
- grep => 'filter_options',
- find => 'find_option',
- first => 'first_option',
- last => 'last_option',
- get => 'get_option',
- join => 'join_options',
- count => 'count_options',
- empty => 'do_i_have_options',
+ map => 'map_options',
+ grep => 'filter_options',
+ find => 'find_option',
+ first => 'first_option',
+ last => 'last_option',
+ get => 'get_option',
+ join => 'join_options',
+ count => 'count_options',
+ empty => 'do_i_have_options',
+ contains => 'options_contains',
}
);
my $option = $stuff->get_option(1);
print "$option\n"; # prints "bar"
+=item B<contains>
+Returns a true value if the list contains the passed value, otherwise returns
+a false value. The return value is actually the number of times the passed
+value appears in the list (0, or more).
+
+ my $found = $stuff->contains( 'apple' );
+ print "Found apple in the list\n" if $found;
+
+Note that this works even when looking for the undefined value.
+
=item B<join>
Joins every element of the list using the separator given as argument.
use Test::Exception;
BEGIN {
- plan tests => 29;
+ plan tests => 36;
}
BEGIN {
'get' => 'get_option_at',
'first' => 'get_first_option',
'last' => 'get_last_option',
+ 'contains' => 'options_contains',
},
curries => {
'grep' => {less_than_five => [ sub { $_ < 5 } ]},
options
join_options
get_option_at
+ options_contains
];
is_deeply($stuff->_options, [1 .. 10], '... got options');
is($stuff->join_options(':'), '1:2:3:4:5:6:7:8:9:10', '... joined the list of options by :');
+is($stuff->options_contains(),0,'... does not contain undef');
+is($stuff->options_contains(5),1,'... contains "5"');
+is($stuff->options_contains(11),0,'... does not contain "11"');
+push @{$stuff->_options}, undef;
+is($stuff->options_contains(undef),1,'... does contain undef');
+push @{$stuff->_options}, 5;
+is($stuff->options_contains(5),2,'... contains returns count');
+splice @{$stuff->_options}, -2;
+is_deeply($stuff->_options, [1 .. 10], '... reset list for regression');
+
# test the currying
is_deeply([ $stuff->less_than_five() ], [1 .. 4]);
'join' => 'join_options',
'get' => 'get_option_at',
'first' => 'get_first_option',
- 'last' => 'get_last_option'
+ 'last' => 'get_last_option',
+ 'contains' => 'options_contains',
}, '... got the right provies mapping');
is($options->type_constraint->type_parameter, 'Int', '... got the right container type');