http://www.perlmonks.org?node_id=809292


in reply to About inheritence ? and Autoload ?

About namespaces and inheritance:

Namespaces, like "Animal::Dog", are just names, as was written before. Inheritance is defined differently, but it is good habit to create namespaces related with inheritance, for instance:

package Animal; #parent class, in file lib/Animal.pm sub new { return bless {}, shift; } sub sound { die "cannot call this method on class '".ref(shift)."'"; } sub output_sound { my ($self, $what) = @_; print $what."\n"; } 1; package Animal::Dog; #desc. of Animal, lib/Animal/Dog.pm use base 'Animal'; sub sound { my ($self) = @_; $self->output_sound("haf"); } 1; package Animal::Dog::Sheepdog; #desc. of Dog #lib/Animal/Dog/Sheepdog.pm use base 'Animal::Dog'; sub guard { my ($self, $flock) = @_; #do something } 1; package Animal::Pig; #other descendant use base 'Animal'; sub sound { my ($self) = @_; $self->output_sound("khro"); } 1;
Now you can create some instance of animal :>) by this way:
use Animal::Dog::Sheepdog; my $helper = Animal::Dog::Sheepdog->new(); #Once you have an instance, you can call it's methods by this way: $helper->sound;
Do not hesitate to ask some questions, I had been confused in the same manner. Just note: that code is not tested, it really should have strictings in every module...

Replies are listed 'Best First'.
Re^2: About inheritence ? and Autoload ?
by lepetitalbert (Abbot) on Nov 25, 2009 at 11:18 UTC

    Hello dear Monks,

    Thank you all for you help !

    ikegami, the error was

    Can't locate object method "new" via package "Command" (perhaps you fo +rgot to load "Command"?) at ./test line 13

    and you said

    You never defined Command::new

    ? here I bug :
    I have a package Test::Command with a sub new, and a use Test::Command;
    Why is Command new not defined ?

    kyle,

    But I'd like some automatic relationship between Test and Test::Command

    Is that a @ISA or inheritence question

    spx2, I read stuff on Moose too and will probably use it, but I thought I'll try to understand first the 'manual' way.

    pajout, I think my understanding bug is somwhere in your example but still don't where ! I'll play with it.
    why can't you use

    use Animal::Dog::Sheepdog; my $helper = Sheepdog->new();

    Thanks again.

    Have a nice day.

    "There is only one good, namely knowledge, and only one evil, namely ignorance." Socrates
      The name of the module is 'Animal::Dog::Sheepdog', so if you try my $helper = Sheepdog->new();, Perl has no clue which module do you mean, respectively, Perl says Sheepdog module is not used. Imagine situation when both Foo and Bar::Foo are used, you have to distinguish in your code which object you want to create.

      Update: It is just about naming, not about inheritance. Inheritance is (in my example) defined by use base.

      If you want to use the current package as the base name of some other package, you could do something like this:

      my $subpackage = __PACKAGE__ . '::Command'; my $test_command = $subpackage->new(@ARGV);

      You could also make a module that installs this behavior into every package. Here's a demonstration:

      sub UNIVERSAL::subpackage { join '::', @_ } package Foo::Command; sub wow { print "I am: ", __PACKAGE__, "\n" } package Foo; sub check { __PACKAGE__->subpackage( 'Command' )->wow() } package main; Foo->check(); __END__ I am: Foo::Command

      In Real Code, you'd put the sub UNIVERSAL::subpackage part into another module which you then use from every package that you want to have that behavior. While "__PACKAGE__->method( 'Blah' )" is a lot longer than just "Blah", it also carries a bit more meaning.

      Is that closer to what you want?

        Hi again,

        pajout, I think I was (am) confused about namespace and inheritance. Thanks for your precisions,

        kyle, that's definitivly exactly what I was lookin for \o/

        Thank you all.

        Have a nice day.


        "There is only one good, namely knowledge, and only one evil, namely ignorance." Socrates