use Contextual::Return; sub foo { my $blah = bless { name => shift }, 'whatever'; return VOID { croak "Useless use of foo() in void context" } STR { $blah->{name} } OBJREF { $blah } DEFAULT { $blah } } my $foo = foo('Boris');