Section 11.7. Starting the Search from a Different Place


11.7. Starting the Search from a Different Place

A better solution is to tell Perl to search from a different place in the inheritance chain:

 { package Animal;   sub speak {     my $class = shift;     print "a $class goes ", $class->sound, "!\n";   } } { package Mouse;   @ISA = qw(Animal);   sub sound { 'squeak' }   sub speak {     my $class = shift;     $class->Animal::speak(@_);     print "[but you can barely hear it!]\n";   } } 

Ahh. As ugly as this is, it works. Using this syntax, start with Animal to find speak and use all of Animal's inheritance chain if not found immediately. The first parameter is $class (because we're using an arrow again), so the found speak method gets Mouse as its first entry and eventually works its way back to Mouse::sound for the details.

This isn't the best solution, however. We still have to keep the @ISA and the initial search package in sync (changes in one must be considered for changes in the other). Worse, if Mouse had multiple entries in @ISA, we wouldn't necessarily know which one had actually defined speak.

So, is there an even better way?




Intermediate Perl
Intermediate Perl
ISBN: 0596102062
EAN: 2147483647
Year: N/A
Pages: 238

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net