in reply to Re: Re: Re: Instance field access from private methods
in thread Instance field access from private methods

I think you have shown me what I'm doing wrong here. Inside of your printGoodBye method, you call printWorld() w/ $self as the invocant whereas I had always been calling that method without any invocant at all. Heh, java rears it's ugly head :)

This must be what robartes meant when he wrote: "...it is a good idea that even your private methods use the class' public accessor methods to get at private instance attributes."

Excellent, excellent.

Now, I'm still not too sure about a subroutine being required to recieve a copy of the invocant in order for it to be classified as a method and thus inheritable. You are right that printGoodBye() recieves the invocant, but printWorld() does not (or else there would be a HASH=... after "World" in the output). However, printWorld is still inherited from C1 by C2.

So, chances are, I'm thinking about this in java-world and being stupid again. But, my original question has been answered, so thanks, guha.



Mark
  • Comment on Re: Re: Re: Re: Instance field access from private methods

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Instance field access from private methods
by perrin (Chancellor) on Oct 23, 2002 at 21:31 UTC
    The reason printWorld is not printing "HASH=" is that you are calling it incorrectly. You're invoking it as a subroutine, not as a method, so it is not inherited at all; it just happens to be in the same package as printGoodBye.

    The correct way to call it is to use the version of printGoodBye in guha's post, which uses $self->printWorld() instead.

Re: ^5 Instance field access from private methods
by guha (Priest) on Oct 23, 2002 at 21:39 UTC

    Well I think the thing is that you invoke printGoodBye as subroutine with no argument, so in your example nothing should be printed

    If you would for some reason put

    printGoodBye(@_); # instead
    you would see the HASH-stuff

    However I think that in order for inheritance to work, the "hash" or instance or ... needs to be BLESSED to some package

    The reason it *seems* to work is that printWorld and printGoodBye are defined in the same package.