in reply to Instance field access from private methods

Plain and simple: if you don't pass $self, it is not a method. It can't be inherited, overriden, etc. You aren't supposed to pass $self explicitly; perl takes care of it for you.

Also, stay away from the symbol table. It's a dangerous place.

  • Comment on Re: Instance field access from private methods

Replies are listed 'Best First'.
Re: Re: Instance field access from private methods
by markcsmith (Novice) on Oct 23, 2002 at 19:04 UTC
    I'm not too sure. I wrote this (first time messing w/ iheritence w/ perl), and C2 obviously inherited the method printWorld even though printWorld isn't passed the invocant of printGoodBye.

    C1.pm:
    *******
    package C1; sub new { my $class = shift; my $self = {}; return bless $self, $class; } sub printGoodBye{ print "Goodbye @_ "; printWorld(); } sub printWorld{ print "World\n @_"; } 1; END {}

    C2.pm
    ******
    package C2; use base ("C1"); sub new { my $class = shift; my $self = {}; return bless $self, $class; } sub printHi{ print "Hi\n"; } 1; END {}

    o.pl
    ****
    #!/usr/bin/perl use C2; $bob = C2->new(); $bob->printGoodBye(); exit 0;


    Let me know if I'm wrong, but this sure looks like it's inheriting something w/o $self being passed to me. Mark

      Let me know if I'm wrong, but this sure looks like it's inheriting something w/o $self being passed to me.

      But it *is* passed, actually $bob is passed as the first element of @_ which is seen in the output

      Goodbye C2=HASH(0x177f054) World

      So you would normally shift off the first element to a lexical variable often called $self to use the subroutine as a method in OO-style

      sub printGoodBye { my $self = shift; print "Goodbye "; $self->printWorld(); } sub printWorld{ my $self = shift; print "World\n "; }

      So inheritance is really in play here.
      I am also a newbie when it comes to perl-OO, so I watch this thread with keen interest.(++)

        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
Re: Re: Instance field access from private methods
by rir (Vicar) on Oct 23, 2002 at 19:58 UTC
    if you don't pass $self, it is not a method. It can't be inherited

    Unless you pass $class instead.