bronto has asked for the wisdom of the Perl Monks concerning the following question:
Dear fellow monks
Some days last week I was working on a project of mine and I came across an old problem: that of providing private, protected and public methods and attributes. Ok, nothing difficult: it's very easy and also the camel book shows some examples of how to do it; for instance, to have a private method one could do this check on top of the sub:
{ my $caller = caller ; die unless $caller eq __PACKAGE__ ; }
Also, wanting private attributes, one could create a "class registry" array, and bless a reference index. Like:
package MyClass ; my @Registry ; my $id = 0 ; sub new { my $class = shift ; my $objID = $id++ ; $Registry[$objID] = { some => 'attribute', goes => 'here' } return bless \$objID,$class ; }
From outside (I mean, from other packages), one could not use $$object to get to data, while inside the object one could use an accessor like:
sub some : lvalue { my $self = shift ; # Do checks if we are a private or protected method # HERE! return $Registry[$$self]{some} ; }
(One should provide a DESTROY to get rid of object data when the object is destroyed, of course).
The problem came out when I tried to generalize the approach. I would like to create, say, something like Class::Struct and have my class export some functions, say private and protected, so that I could say:
package MyClass ; use Class::Bronto ; # Sorry, can't find a meaningful name! private 'scalar','priv' ; protected 'array','prot' ; public 'hash','pub' ;
and having a private scalar attribute named 'priv' and so on created along with suitable accessor methods and constructor
The question is: how can I create such a class? What private and fellows are supposed to do to create a good constructor and accessors?
Don't misunderstand me, I'm not looking for directions on Exporter's direction or to CPAN modules to read the code from. I know I could take a peek into the code of Class::Struct and Tie::SecureHash, but I'm taking a different approach. Instead of peeking into someone else's code, I would like to have general suggestions on how to accomplish what I am trying to do, and try to do it myself. If I'll succeed, I know I'll have a good lesson learnt. If I'd read other's code, I know I'll end in use the tricks and forget them some days later. So, if you are willing to help me, don't write too much code ;-)
I already read the camel book and tried some different approaches from which I already learnt a lot. Unfortunately, none of these approaches satisfied me for different reasons. For example, the "class registry" is good for simplicity, but bad for other reasons; the "blessed closure" approach is great, but a bit difficult to read, and I like readable code a lot!
Any advice?
Thanks in advance
--bronto
# Another Perl edition of a song:
# The End, by The Beatles
END {
$you->take($love) eq $you->made($love) ;
}
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Looking for exportable privacy and protection
by broquaint (Abbot) on Jul 09, 2002 at 12:33 UTC | |
by bronto (Priest) on Jul 11, 2002 at 09:47 UTC | |
by broquaint (Abbot) on Jul 11, 2002 at 11:54 UTC | |
by bronto (Priest) on Jul 11, 2002 at 12:04 UTC |