in reply to Re: Modifying/extending a superclass' data
in thread Modifying/extending a superclass' data

These question suggest that there are some basics about Perl OO that you're missing.

Absolutely! I've spent two years in JavaLand, and forgotten all the nifty Perl stuff that was in my head..

Unfortunately, to the last point, if %ENTITIES is a "my" variable in MathML::Entities, you can't access it directly without "breaking the rules"...

I can't even access it to make a copy, can I? - no way of making %M::E::A::ENTITIES ?

If I understand it correctly, if %ENTITIES was an "our" variable, I could have added data to it - and the E::M methods would have accessed the now-longer-hash, yes?



-- Ian Stuart
A man depriving some poor village, somewhere, of a first-class idiot.

Replies are listed 'Best First'.
Re^3: Modifying/extending a superclass' data
by xdg (Monsignor) on Nov 17, 2005 at 14:15 UTC
    I can't even access it to make a copy, can I? - no way of making %M::E::A::ENTITIES ?

    Think of a "my" as similar to "private" data in Java (if I remember my Java, that is). It's pretty much totally inaccessable without using XS to violate the encapsulation and troll through the Perl guts directly. Your best bet may be to do a copy/paste into your subclass and modify it that way. Ugly hack and dependency, but probably the sanest alternative if you really need it.

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

      Your best bet may be to do a copy/paste into your subclass and modify it that way.

      Yeuck! - there are over two thousand entries in that hash.. <grin />

      I've changed %M::E::ENTITIES to have "our" scope - which seems to work. My only worry is missing some problem about memory leak, an oversized memory foot-print, or soke form of data-clash - but the scoping should take care of that...

      :-)



      -- Ian Stuart
      A man depriving some poor village, somewhere, of a first-class idiot.

        Oh! I wasn't clear that you controlled both. You could do a form of protected access that returns a reference to the structure. (Breaking encapsulation in a limited way).

        # in MathML::Entities my %ENTITIES; sub _get_entity_hash { my $caller = caller; if ( $caller->isa("MathML::Entities") ) { return \%ENTITIES; } else { die "_get_entity_hash can't be called from $caller" } }

        -xdg

        Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.