# Setup 3 methods find_ids1, find_ids2, find_ids3 ################################################### use SUPER; # Using a code ref extracted at compile time my $orig = $class->can('find_ids'); install_sub($class,'find_ids1', sub { my $class = shift; my %params = ref $_[0] ? %{ $_[0] } : (@_); foreach my $column (keys %params) { if (exists $alias_for->{$column}) { $params{$alias_for->{$column}} = delete $params{$column}; } } return $orig->($class,\%params); }); # Using SUPER install_sub($class,'find_ids2', sub { my $class = shift; my $super = $class->super('find_ids'); my %params = ref $_[0] ? %{ $_[0] } : (@_); foreach my $column (keys %params) { if (exists $alias_for->{$column}) { $params{$alias_for->{$column}} = delete $params{$column}; } } return $super->($class,\%params); }); # Using string eval my $sub = eval "package $class;".<<'SUB'; *find_ids3 = sub { my $class = shift; my %params = ref $_[0] ? %{ $_[0] } : (@_); foreach my $column (keys %params) { if (exists $alias_for->{$column}) { $params{$alias_for->{$column}} = delete $params{$column}; } } return $class->SUPER::find_ids(\%params); }; SUB ############### # Run the Benchmark use Benchmark qw (cmpthese); cmpthese (100000, { orig => sub {MyClass->find_ids1()}, super => sub {MyClass->find_ids2()}, eval => sub {MyClass->find_ids3()}, }); ######################### # The find_ids method in the superclass just returned #########################