The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Contextual::Return;

sub bar {
    return 'in bar';
}

sub foo {
    return
        BOOL      { RESULT { 0 }; undef }
        LIST      { RESULT { 1,2,3 }; undef }
        NUM       { RESULT { 42 }; undef }
        STR       { RESULT { 'forty-two' }; undef }
        SCALAR    { RESULT { 86 }; undef }
        SCALARREF { RESULT { \7 }; undef }
        HASHREF   { RESULT { { name => 'foo', value => 99} }; undef }
        ARRAYREF  { RESULT { [3,2,1] }; undef }
        GLOBREF   { RESULT { \*STDERR }; undef }
        CODEREF   { RESULT { \&bar }; undef }
    ;
}

package Other;
use Test::More 'no_plan';

is_deeply [ ::foo() ], [1,2,3]                  => 'LIST context';

is do{ ::foo() ? 'true' : 'false' }, 'false'    => 'BOOLEAN context';

is 0+::foo(), 42                                => 'NUMERIC context';

is "".::foo(), 'forty-two'                      => 'STRING context';

is ${::foo}, 7                                  => 'SCALARREF context';

is_deeply \%{::foo()},
          { name => 'foo', value => 99}         => 'HASHREF context';

is_deeply \@{::foo()}, [3,2,1]                  => 'ARRAYREF context';

is \*{::foo()}, \*STDERR                        => 'GLOBREF context';

is ::foo->(), 'in bar'                          => 'ARRAYREF context';


use Contextual::Return;

sub bar {
    NUM { 42 }
    RECOVER { RESULT { RESULT()+1 } }
}

is 0+bar(), 43,                                 => 'RESULT()';