in reply to ISA with packages ... A barebones minimal example

use strict; package Alpha; our $language = "US-English"; $Alpha::first = "Alpha"; sub SayHello {"hello from package Alpha\n"}; sub SayBye {"Goodbye.\n"} sub GreetByName {"Well Hello $_[0].\n";} package Bravo; our @ISA = qw(Alpha); $Bravo::first = "Bravo"; sub SayHello {"hello from package Bravo\n"}; package main; ### begin_: get stuff from A print("$Alpha::first\n"); print Alpha::SayHello(); print("$language\n"); print Alpha::SayBye(); print Alpha::GreetByName('Dolly'); ### works as expected print Alpha->GreetByName('Dolly'); ### D'OH! not what we expected print "\n---------------------\n"; ### begin_: get stuff from Bravo print("$Bravo::first\n"); print Bravo::SayHello(); print("$language\n"); print Bravo->SayBye(); ### works as expected print Bravo->GreetByName('Billy'); ### D'OH! 'Hello Bravo' print "\n---------------------\n"; 1; __END__

Replies are listed 'Best First'.
Re: reworked code but still doesnt work ...
by Joost (Canon) on Oct 08, 2004 at 19:17 UTC
    I'll just pick one example, because the other one works the same, only without inheritance.
    print Bravo->SayBye(); ### works as expected print Bravo->GreetByName('Billy'); ### D'OH! 'Hello Bravo'

    The syntax Package->subname(@arguments) calls a class method, with inheritance if needed. The first argument supplied to the sub subname will be the name of the Package, in your case, @_ = ("Bravo","Billy"). Likewise, for methodcalls on objects, the object is passed as the first argument. Some languagages prefer to do this behind your back (i.e. Java & C++'s this object), but Perl is very explicit about all of this.

    In your code, you don't need that first argument, so just ignore it, however, if you want to bless objects into the right class, or pass the package name on, you do need it.

    See also perltoot perlobj,perlobj, perlboot, perltooc, and perlbot.