That is a great book. I read it several times, and foundation of the knowledge I have of references to this day is owed to that book.
Personally, unless absolutely necessary, I try to stay away from having to set attributes individually. I prefer to try to set these within larger public methods that set/reset the attribute then do something functional with it, like this:
sub write_graffiti {
my $self = shift;
my %params = @_;
$self->{colour} = $params{colour} if defined $params{colour};
# spray paint wall with the colour,
# whether new or existing
}
When I do need to expose a direct setter/getter for an individual attribute, I do both in one fell swoop, in a more generic sub:
sub colour {
my $self = shift;
my $colour = shift if @_;
$self->{colour} = $colour if defined $colour;
return $self->{colour};
}