1use Contextual::Return;
2
3sub bar {
4    return 'in bar';
5}
6
7sub foo {
8    return
9        BOOL      { 0 }
10        LIST      { 1,2,3 }
11        NUM       { 42 }
12        STR       { 'forty-two' }
13        SCALAR    { 86 }
14        SCALARREF { \7 }
15        HASHREF   { { name => 'foo', value => 99} }
16        ARRAYREF  { [3,2,1] }
17        GLOBREF   { \*STDERR }
18        CODEREF   { \&bar }
19        CLEANUP   { Other::ok(1 => 'CLEANUP') }
20    ;
21}
22
23package Other;
24use Test::More tests=>27;
25
26is_deeply [ ::foo() ], [1,2,3]                  => 'LIST context';
27
28is do{ ::foo() ? 'true' : 'false' }, 'false'    => 'BOOLEAN context';
29
30is 0+::foo(), 42                                => 'NUMERIC context';
31
32is "".::foo(), 'forty-two'                      => 'STRING context';
33
34is ${::foo}, 7                                  => 'SCALARREF context';
35
36is_deeply \%{::foo()},
37          { name => 'foo', value => 99}         => 'HASHREF context';
38
39is_deeply \@{::foo()}, [3,2,1]                  => 'ARRAYREF context';
40
41is \*{::foo()}, \*STDERR                        => 'GLOBREF context';
42
43is ::foo->(), 'in bar'                          => 'ARRAYREF context';
44
45$foo = ::foo();
46
47is ${$foo}, 7                                  => 'SCALARREF via var';
48
49$foo = undef;
50
51my ($void, $tested);
52sub side_effect {
53    use Contextual::Return;
54    return
55        BOOL { $tested = 1 }
56        VOID { $void   = 1 }
57        CLEANUP { $_ = 42 if $tested }
58};
59
60side_effect();
61
62is $void, 1     => 'SIDE EFFECT VOID';
63ok !defined $_  => 'NO ASSIGNMENT TO $_';
64
65undef $void;
66
67my $side_effect   = side_effect();
68ok !defined $void => 'SIDE EFFECT NONVOID';
69ok !defined $_    => 'NO ASSIGNMENT TO $_';
70
71ok side_effect()  => 'SIDE EFFECT BOOLEAN';
72ok !defined $void => 'SIDE EFFECT BOOLEAN NONVOID';
73is $_, 42         => 'ASSIGNMENT TO $_';
74