In a inside-out implementation, you need to a way to identify the object that you are working with. The only difference between different objects of the same class are their addresses. by using refaddr we can uniquely identify our objects and hidden the variables in each object from each other.
A very short example
package Foo::Bar;
use Scalar::Util qw(refaddr);
my %var;
sub get_var {
my $self = shift;
return $var{ refaddr( $self ) };
}
sub set_var {
my $self = shift;
my $value = shift;
$var{ refaddr( $self ) } = $value;
return 1;
}
# Not completely sure that this is correct.
sub new {
my $class = shift;
return bless \my($anon_scalar), $class;
}
Take a look at Class::Std or Damian Conway's Best Practices on the concept.