in reply to Call Grandparent Method, Skipping Parent
Just hardcode the package name you wish to skip to:
$self->SomeClass::method(...);
Example:
#!/usr/bin/env perl use strict; use warnings; { package Animal; sub foo { my $class = shift; print __PACKAGE__, "\n"; } } { package Mammal; use base "Animal"; sub foo { my $class = shift; print __PACKAGE__, "\n"; $class->SUPER::foo(@_); } } { package Primate; use base "Mammal"; sub foo { my $class = shift; print __PACKAGE__, "\n"; $class->SUPER::foo(@_); } } { package Monkey; use base "Primate"; sub foo { my $class = shift; print __PACKAGE__, "\n"; $class->Mammal::foo(@_); # skip over Primate::foo } } Monkey->foo;
Here's an alternative Monkey::foo sub that avoids hard-coding the Mammal class name:
sub foo { my $class = shift; print __PACKAGE__, "\n"; require mro; my $grandparent = $class->mro::get_linear_isa->[2]; my $gp_method = $grandparent->can('foo'); $class->$gp_method(@_); }
Or even:
sub foo { my $class = shift; print __PACKAGE__, "\n"; require mro; $class->${\ $class->mro::get_linear_isa->[2]->can("foo") }(@_); }
Note that mro requires Perl 5.10 or better, but there exists a MRO::Compat that provides an alternative implementation of mro::get_linear_isa for Perl 5.8.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: Call Grandparent Method, Skipping Parent
by QM (Parson) on Jun 20, 2013 at 12:42 UTC | |
by tobyink (Canon) on Jun 20, 2013 at 13:14 UTC |