.... my ($class,$alias_for) = @_; install_sub( $class, 'find_ids', sub { my ($class,$params) = @_; do_something_with($alias_for); # $alias_for is a lexical which defined outside this sub # which uses deep binding so that it is available # when this sub is called return $class->SUPER::find_ids($params); }); .... #### eval "package $class; sub find_ids { ..... }"; #### .... my ($class,$alias_for) = @_; # Store the original find_ids here my $original_find_ids = $class->can('find_ids') or die "Super-classes of $class don't define sub find_ids"; install_sub( $class, 'find_ids', sub { my ($class,$params) = @_; # Do something with $alias_for; # Use the original find_ids as a function # $class as its first argument, so it thinks # that it has been called as a method return $original_find_ids->($class,$params); }); ....