my $func = sub { my ($call_next, $param1, $param2) = @_; do { something }; $call_next->($call_next, $newparam1, $newparam2); }; my $nice_func = sub { $func->($func, @_) }; ## now you don't have a bizarre calling convention: $nice_func->(param1, param2);