in reply to Generic accessor for inside-out objects...

It all depends where you've declared e.g. %working_dir_of:
{ my %working_dir_of; } sub get { ... }

won't work, but

my %working_dir_of; sub get { ... }

does: accessor and declaration have to be in the same scope. In principle, the string eval technique works, as seen with this snippet

#!/usr/bin/perl use strict; my %hash = ( foo => 'bar'); sub meth { my ($h,$k) = @_; my $string = sprintf 'print $%s{%s},"\n"', $h, $k; eval $string; }; meth('hash','foo'); __END__ bar

but it looks a bit whacky and eval is costly, too. Why is it deemed good practice to name an attribute e.g. dbh and the corresponding inside out attribute hash %dbh_of ? Looks to me like calling for trouble.

If you want to stick with that "good practice", I'd recommend to set up a property hash keyed by the real attribute names, and having as values references to the attribute hashes:

my( %dbh_of, %dir_of, ...); my %props = ( dbh => \%dbh_of, dir => \%dir_of, ... ); sub get { my($self,$attr) = @_; my $return_val; # if valid attribute, return the object's value if( defined $props {$attr} ) { return $props {$attr} -> { refaddr $self}; } # otherwise, carp a warning else { carp("Invalid attribute '$attr'"); } }

Note that I've dropped the return value in case of failure; returning nothing at all in this case is better than returning an undefined value IMHO.

Have a look at Alter for a simpler, faster and cleaner approach to insiteoudish object data encapsulation (e.g. no hassle with DESTROY).

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}