Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: Call Grandparent Method, Skipping Parent

by tobyink (Canon)
on Jun 20, 2013 at 11:53 UTC ( [id://1039962]=note: print w/replies, xml ) Need Help??


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.

package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

Replies are listed 'Best First'.
Re^2: Call Grandparent Method, Skipping Parent
by QM (Parson) on Jun 20, 2013 at 12:42 UTC
    Thanks. See the update to the OP.

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of

      mro has been in the core for about 6 years.

      package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1039962]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (5)
As of 2024-03-28 13:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found