sub instantiator { my $state = shift; if( $state eq 'scalar' ) { return sub { ... something scalarly ... } } elsif( $state eq 'array' ) { return sub { ... an array of possibilities ... } } else { # hash return sub { ... make a complete hash of things ... } } } #### 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 );