sub name :lvalue { shift->name } # and later $object->name = [qw/ random unvalidated value which breaks encapsulation /]; #### sub name { my $self = shift; return $self->{name} unless @_; $self->{name} = shift; return $self; } #### sub set_name { my $self = shift; croak "set_name() requires a name, silly!" unless @_; $self->{name} = shift; # insert other validation here } #### $object->name($name); $object->age($age); $object->id($id); # huh? #### $object->set_name($name); $object->set_age($age); $object->set_id($id); # huh?