9.5 Inheriting the Constructor
Was
there anything specific to Horse in that method?
No. Therefore, it's also the same recipe for
building anything else inherited from Animal, so
let's put it there:
{ package Animal;
sub speak {
my $class = shift;
print "a $class goes ", $class->sound, "!\n"
}
sub name {
my $self = shift;
$$self;
}
sub named {
my $class = shift;
my $name = shift;
bless \$name, $class;
}
}
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
}
Ahh, but what happens if you invoke speak on an
instance?
my $tv_horse = Horse->named("Mr. Ed");
$tv_horse->speak;
You get a debugging value:
a Horse=SCALAR(0xaca42ac) goes neigh!
Why? Because the
Animal::speak routine expects a classname as its
first parameter, not an instance. When the instance is passed in,
you'll use a blessed scalar reference as a string,
which shows up as you saw it just now—similar to a stringified
reference, but with the class name in front.
|