I have a set of related[*] modules that all have very similar accessor/mutator methods for their object's instance variables. Instead of typing virtually the same code over and over, I wrote a private _get_set() method in the ultimate base class. I first tried to use aliasing the get the actual method name called, but that didn't work and lead to the OP. I endded up writing another private method that defined all the public accessor/mutators using closures much like adrianh suggests above. Although my closures only call the ultimate _get_set method whereas you are putting the full code in the closure itself (I'll probably make that change since it will increase efficiency slightly and prevent users from calling _get_set directly -- with unpredictable results)
BTW - I thought about an AUTOLOAD for this purpose, but:
- I don't believe AUTOLOADs do inheritance (correct me if I'm wrong) and I didn't want to have to create a separate AUTOLOAD for each class.
- I wanted a similar mechanism for handling calls to abstract methods (i.e., if you manage to instantiate an abstract base class and then call one of it's abstract methods you should get feedback that is more helpful than "subroutine not found") and didn't want to confound the two functions into a single AUTOLOAD.
- AUTOLOADs are messy.
[*] Related in the OO-sense, super-/sub-class relationships
--DrWhy
"If God had meant for us to think for ourselves he would have given us brains. Oh, wait..."
| [reply] |
package Foo;
# ...
my @fields = qw( eenie meenie minie moe );
make_accessor( $_ ) for @fields;
# ...
sub make_accessor {
my $method = shift;
my $sub = sub {
# your accessor here;
};
my $class = caller;
{
no strict 'refs';
*{ "$class\::$method" } = $sub;
}
return;
}
...which does not require the methods to know their names.
| [reply] [d/l] |