in reply to Generic accessor for inside-out objects...
{ 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}
|
|---|