package Object; use Hash::Util::FieldHash; use overload '%{}' => \&_get_props, fallback => 1; Hash::Util::FieldHash::fieldhash my %objects; sub new { my $class = shift; my $self = bless do { \my($x) }, $class; $objects{$self} = { prop1 => 'foo', prop2 => 'bar', blorf => sub {time}, }; bless $self, $class; } # getters/setters... sub get_prop1 { $objects{shift(@_)}->{prop1}; } # ... and so on sub _get_props { my $obj = shift; $objects{$obj}; +{ map { $_, ref $objects{$obj}->{$_} eq 'CODE' ? $objects{$obj}->{$_}->() : $objects{$obj}->{$_} } keys %{$objects{$obj}} } } 1; __END__