package Foo; use overload "&{}" => \&deref; sub instatntiate { my $state = shift; # ... return bless { _original_code => sub { ... } } } sub deref { my $self = shift; ## examine $self and create $newsub using $self->{_original_code} $newsub->( @_ ); } package main; $f = Foo::instantiate( ... ); $f->( $a, $b, $c );