use Contextual::Return;
sub bar {
return 'in bar';
}
sub foo {
return
BOOL { 0 }
LIST { 1,2,3 }
NUM { 42 }
STR { 'forty-two' }
SCALAR { 86 }
SCALARREF { \7 }
HASHREF { { name => 'foo', value => 99} }
ARRAYREF { [3,2,1] }
GLOBREF { \*STDERR }
CODEREF { \&bar }
CLEANUP { Other::ok(1 => 'CLEANUP') }
;
}
package Other;
use Test::More tests=>27;
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';
$foo = ::foo();
is ${$foo}, 7 => 'SCALARREF via var';
$foo = undef;
my ($void, $tested);
sub side_effect {
use Contextual::Return;
return
BOOL { $tested = 1 }
VOID { $void = 1 }
CLEANUP { $_ = 42 if $tested }
};
side_effect();
is $void, 1 => 'SIDE EFFECT VOID';
ok !defined $_ => 'NO ASSIGNMENT TO $_';
undef $void;
my $side_effect = side_effect();
ok !defined $void => 'SIDE EFFECT NONVOID';
ok !defined $_ => 'NO ASSIGNMENT TO $_';
ok side_effect() => 'SIDE EFFECT BOOLEAN';
ok !defined $void => 'SIDE EFFECT BOOLEAN NONVOID';
is $_, 42 => 'ASSIGNMENT TO $_';