package TAEB::Message::SelectSubset; use Moose::Role; has items => ( is => 'ro', isa => 'ArrayRef', required => 1, auto_deref => 1, ); has _is_selected => ( is => 'ro', isa => 'ArrayRef', lazy => 1, default => sub { [ 0 x shift->items ] }, ); sub select { my $self = shift; for my $selection (@_) { for my $index (0 .. $self->items - 1) { my $item = $self->items->[$index]; $self->_is_selected->[$index] = 1 if $item eq $selection; } } } sub selected { my $self = shift; return map { $self->items->[$_] } grep { $self->_selected->[$_] } 0 .. $self->items - 1; } no Moose::Role; 1;