package Album::Set; {
use Moose;
use MooseX::Iterator;
use List::Util qw(shuffle);
has resource_types => (
is => 'ro',
isa => 'Object',
required => 1,
);
has collection => (
is => 'ro',
isa => 'ArrayRef[HashRef]',
required => 1,
);
has iterator => (
is => 'ro',
isa => 'MooseX::Iterator::Array',
lazy_build => 1,
handles => [qw/has_next reset/],
);
sub _build_iterator {
my $self = shift @_;
MooseX::Iterator::Array->new(
collection => $self->collection,
);
}
sub inflate {
my ($self, $item) = @_;
$self->resource_types->process($item);
}
sub peek {
my $self = shift @_;
my $peek = $self->iterator->peek;
my $inflated = $self->inflate($peek);
return $inflated;
}
sub next {
my $self = shift @_;
my $next = $self->iterator->next;
my $inflated = $self->inflate($next);
return $inflated;
}
sub all {
my $self = shift @_;
map {
$self->inflate($_);
} @{$self->collection};
}
sub find {
my ($self, $title) = @_;
my($match, @others) = grep {
$_->{title} eq $title;
} @{$self->collection};
warn "find matches too many titles for $title"
if @others;
return $match ? $self->inflate($match) : undef;
}
sub slice {
my ($self, $offset, $length) = @_;
my @collection = splice(@{$self->collection}, $offset, $length);
__PACKAGE__->new(
collection => \@collection,
resource_types => $self->resource_types,
);
}
sub randomize {
my $self = shift @_;
my @collection = shuffle @{$self->collection};
__PACKAGE__->new(
collection => \@collection,
resource_types => $self->resource_types,
);
}
}
1;