Encapsulation of an object means you should never access attributes directly but use accessors and mutators(getters and setters).
One exceedling cool way to do this which I think I can credit to someone from this site(please correct me if not) is with Autoload.
If you put the following code into your class it automagically creates get_attributename() and set_attributename() methods dynamically at runtime. So you dont have to manually write 2 methods for every attribute. If you make a typo when accessing an attribute you get a nice error message saying that no method exists.
sub AUTOLOAD {
# AUTOLOAD object accessor/mutator method
no strict "refs"; # allow me access to the symbol table
my ($self,$newval) = @_;
return if $AUTOLOAD =~ /::DESTROY$/o; # let perl handle its own cl
+ean up
if ($AUTOLOAD =~/.*::get(_\w+)/ && $self->_accessible($1, 'read'))
+{
my $attr_name = $1;
*{$AUTOLOAD} = sub{ return $_[0]->{$attr_name}; }; # Creates a
+n encapsulated method in the symbol table
return $self->{$attr_name};
}
# determine set or get method
if ($AUTOLOAD =~/.*::set(_\w+)/ && $self->_accessible($1, 'write')
+){
my $attr_name = $1;
*{$AUTOLOAD} = sub{ return $_[0]->{$attr_name}=$_[1]; };
return $self->{$attr_name}=$newval;
}
# no method for this object attribute
die "No such method!: $AUTOLOAD";
}