While this is not something I've had much (any) personal practice with, I recall from reading about it, in Damian's excellent book (Object Oriented Perl, esp. chapter 11), that you can effectively "hide" object data by using closures; e.g.:
{
my $object_data;
sub _get_data {
return $object_data;
}
}
The "_get_data()" sub can be called by various methods defined elsewhere in this object's package, and when it's called, the content of $object_data will be returned. But that scalar variable is out of scope, hence inaccessible, for everything but "_get_data()".