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

{
    sub foo : lvalue {
        my $x = 0;
        my $wantarray = wantarray;
        RVALUE { 
            BOOL { $x > 0 }
            STR  { "[$x]" }
            NUM  {   $x   }
        }
        LVALUE {
            $x = $_[0] * $_;
            is $CALLER::_, 'wunderbar' => 'Caller::_';
        }
        NVALUE {
            ok !defined $wantarray     => 'NVALUE context';
        }
    }
}

$_ = 'wunderbar';

for my $foo (foo 10) {
    is $foo+0,   0      => "Pre-numerication";
    is "$foo", "[0]"    => "Pre-stringification";
    ok !$foo            => "Pre-boolification";
    $foo = 99;
    is $foo+0,   990    => "Post-numerication";
    is "$foo", "[990]"  => "Post-stringification";
    ok $foo             => "Post-boolification";
}

is 0+foo,    0    => "Ex-numerication";
is "".foo, "[0]"  => "Ex-stringification";
ok !foo()         => "Ex-boolification";
foo(1) = 99;
is 0+foo,    0    => "Ex-post-numerication";
is "".foo, "[0]"  => "Ex-post-stringification";
ok !$foo          => "Ex-post-boolification";

foo();

my $f = \foo();


{
    sub foo2 : lvalue {
        LVALUE {
            ok 1;
        }
    }
}

for my $foo (foo2) {
    $foo = 99;
}