package Foo; sub baz { my $self = shift(); foreach (@_) { print "$_ is a ".(ref $_ ? "reference" : "string")."\n"; } } ... package main; my $FooX = {}; tie %$FooX, 'Interpolation::general', sub { my $cmd = shift(); no strict 'refs'; $foo->$cmd(@_); }, '$$*->$'; print "x $FooX->{baz}{1}{2}{$foo}\n"; or my $CALLX = {}; tie %$CALLX, 'Interpolation::general', sub { my $obj = shift(); #print "Yep it's a ref\n" if ref $obj; my $cmd = shift(); no strict 'refs'; $obj->$cmd(@_); }, '$$$*->$'; print "x $CALLX->{$foo}->{baz}{$ref}{100}{$object}\n";