my $list_item = { obj => $server, selected => 0, }; #### @servers = map { $_->{obj} } grep { $_->{selected} } @servers; #### 1 package Trait::Selected; 2 3 use strict; 4 use warnings; 5 6 use Class::Trait 'base'; 7 8 our @REQUIRES = qw(id); 9 10 my $get_id = sub { 11 my $self = shift; 12 return sprintf "%s %d" => ref $self, $self->id; 13 }; 14 15 my %is_selected; 16 17 sub is_selected { 18 my $self = shift; 19 my $id = $self->$get_id; 20 $is_selected{$id} ||= 0; 21 return $is_selected{$id} unless @_; 22 $is_selected{$id} = shift; 23 return $self; 24 } 25 26 1; #### # This used to be $item->{selected} = 1; and is really easy to mistype $object->is_selected(1); # Mistyping the method becomes a runtime failure #### @servers = map { $_->{obj} } grep { $_->{selected} } @servers;