#!/usr/bin/perl -l package A; use Moose; sub doit { warn "A::doit\n" } package B; use Moose; extends 'A'; sub doit { my ($self, $class) = @_; warn "B::doit\n"; return $class ? $class->doit : $self->SUPER::doit; } package C; use Moose; extends 'B'; package D; use Moose; sub doit { warn "D::doit\n" } package main; my $c = C->new; $c->doit( D->new );