package Foo; use strict; sub new { bless {}, shift(); } sub do_something { my $self = shift; my $name = shift || 'foo'; return make_do_something($name); } sub make_do_something { my $name = shift; return sub { my $self = shift; print "Foo $name!!!\n"; } } 1; ############################################## package Bar; use strict; use base 'Foo'; sub new { bless {}, shift(); } sub do_something { my $self = shift; return $self->SUPER::do_something('bar'); } 1;