Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re^3: Inside-out objects inheriting from hash-based classes

by xdg (Monsignor)
on Dec 07, 2005 at 21:52 UTC ( #515056=note: print w/replies, xml ) Need Help??

in reply to Re^2: Inside-out objects inheriting from hash-based classes
in thread Inside-out objects inheriting from hash-based classes

But what happens if you need/want to make explicit calls to a super class?

print( $object->Borg::comment(), "\n" );

Updated/expanded for clarity

Assume that you have a method of the same name in Borg as you do in Foo:

package Borg; sub comment { return $_[0]->{default_threat}; }

If I want to explicitly call the Borg version of that method, I'd call it as $obj->Borg::comment(). However, that's equivalent to this:

Borg::comment( $obj );

Therefore, if Borg::comment is expecting an object of type Borg and intends to muck with its internal structure directly, this will fail since the real Borg object is hidden in a closure in Foo and keyed to $obj and $obj is just the blessed reference for the inside-out object.

Or have I missed something?


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.

Replies are listed 'Best First'.
Re^4: Inside-out objects inheriting from hash-based classes
by jdhedden (Deacon) on Dec 08, 2005 at 05:27 UTC
    In the case you describe, Borg::comment is overridden by Foo::comment, and, as a result of the architecture, is not directly callable using $obj->Borg::comment.

    If it was intended by Foo's author that Borg::comment should be overridden, then no one should be writing code that uses Foo and also tries to by-pass Foo's version of the comment method.

    If the overriding was accidently, then either Foo's author can rename Foo::comment, or can provide a wrapper method so that the functionality of Borg::comment is made available under a different name.

    This is an interesting technical point, but I would imagine that a situation like this would rarely occur in practice. Nonetheless, I'll add information about this to the POD. Thanks.

    Update: Actually, this applies to more than just overridden methods. You can't use any fully-qualified method calls to inherited foreign classes. But then again, you shouldn't need to.

    Remember: There's always one more bug.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://515056]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2019-11-12 06:42 GMT
Find Nodes?
    Voting Booth?
    Strict and warnings: which comes first?

    Results (64 votes). Check out past polls.