use warnings; use strict; { package A; sub new { bless {}, shift } sub _exe { my $self = shift; my $meth = shift; $self->$meth(@_); } } { package B; use base 'A'; sub new { bless {}, shift } sub _what { my $self = shift; $self->_exe('_print', @_); } sub _print { my ($self, @args) = @_; print @args, "\n"; } } my $b = B->new; $b->_what("foo","bar"); # prints "foobar"