in reply to my $self is stumped!

You could skip the method dispatch completely and call the sub as a sub. That is, in package person:

sub introduce { my($self)=$_[0]; print "Hello, I'm "; # $self->tellName(); tellName( $self ); }

With this change only, the new code produces:

Hello, I'm Alice. Hi, I'm Billy The Kid. Here's my mom: Hello, I'm Alice.

I don't recommend that in general, however. For the programmer who comes to your work later (probably you), this could be confusing.

Update: Another sort of lousy solution:

package child; sub tellName { my($self)=$_[0]; if ( caller eq __PACKAGE__ ) { print "$self->{'nickName'}.\n"; } else { $self->SUPER::tellName(); } }

I don't think this is a whole lot better except that it's a lot more obvious that you've done something tricky. I really like ysth's recommendation that the child have a reference to a separate parent object.

Replies are listed 'Best First'.
Re^2: my $self is stumped!
by dsheroh (Monsignor) on Jun 22, 2007 at 16:17 UTC
    If you truly want to call a method of a fixed class, ignoring polymorphism, then I'd go with a slightly modified version of your first option:
    sub introduce { my($self)=$_[0]; print "Hello, I'm "; # $self->tellName(); # tellName( $self ); person::tellName($self); }
    This makes it very clear what you're doing (always use person's tellName) and isn't as brittle as your second version (if we add a "student" subclass of child, then a student's $self->SUPER::tellName will call child's tellName instead of person's).

    But, as others have said, it's more likely that you don't really want to do this and, if you think you do, you may be confusing classes and instances, so I'd look at it first as a design issue before writing hacky code to make it work.