According to
http://search.cpan.org/~flora/Moose-1.01/lib/Moose/Meta/Attribute/Native/Trait/Array.pm
"natatime($n, $code)
This method returns an iterator which, on each call, returns $n more
items from the array, in order, like natatime from List::MoreUtils. A
coderef can optionally be provided; it will be called on each group of $n
elements in the array.
"
However, the coderef option doesn't work as expected.
== Testing script:
package AAA;
use Moose;
has attr => (
isa => 'ArrayRef',
traits => ['Array'],
default => sub { [1,2,3,4] },
handles => {
get_iter => [ natatime => 2 ],
}
);
has attr2 => (
isa => 'ArrayRef',
traits => ['Array'],
default => sub { [1,2,3,4] },
handles => {
get_iter2 => [ natatime => 2 => sub {} ],
}
);
package main;
my $r = AAA->new;
my $it = $r->get_iter;
while (my @vars = $it->()) {
print "iter: ", @vars, "\n";
}
my $it2 = $r->get_iter2;
while (my @vars = $it2->()) {
print "iter2: ", @vars, "\n";
}
==
Output:
$ perl test.pl
iter: 12
iter: 34
$
===
The reason why there's no output from it2 is that iterator has been
exhausted by "sub {}" already.
See code from:
http://cpansearch.perl.org/src/FLORA/Moose-1.01/lib/Moose/Meta/Attribute/Native/MethodProvider/Array.pm
sub natatime : method {
my ( $attr, $reader, $writer ) = @_;
return sub {
my ( $instance, $n, $f ) = @_;
my $it = List::MoreUtils::natatime($n, @{ $reader->($instance) });
if ($f) {
while (my @vals = $it->()) {
$f->(@vals);
}
}
$it;
};
}
http://cpansearch.perl.org/src/VPARSEVAL/List-MoreUtils-0.22/lib/List/MoreUtils.pm
sub natatime ($@)
{
my $n = shift;
my @list = @_;
return sub
{
return splice @list, 0, $n;
}
}
==
Hope someone could fix this bug.
Regards,
Justin