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) ;
}


In reply to Looking for exportable privacy and protection by bronto

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.