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;