#!/usr/bin/perl use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 2; use Test::NoWarnings; use Aspect; my @CONTEXT = (); SCOPE: { package Foo; sub before { if ( wantarray ) { push @CONTEXT, 'array'; } elsif ( defined wantarray ) { push @CONTEXT, 'scalar'; } else { push @CONTEXT, 'void'; } } sub after { if ( wantarray ) { push @CONTEXT, 'array'; } elsif ( defined wantarray ) { push @CONTEXT, 'scalar'; } else { push @CONTEXT, 'void'; } } } # Before the aspects SCOPE: { () = Foo->before; my $dummy = Foo->before; Foo->before; } SCOPE: { () = Foo->after; my $dummy = Foo->after; Foo->after; } # Enable the aspects my $before = before { if ( $_[0]->wantarray ) { push @CONTEXT, 'ARRAY'; } elsif ( defined $_[0]->wantarray ) { push @CONTEXT, 'SCALAR'; } else { push @CONTEXT, 'VOID'; } if ( wantarray ) { push @CONTEXT, 'ARRAY'; } elsif ( defined wantarray ) { push @CONTEXT, 'SCALAR'; } else { push @CONTEXT, 'VOID'; } } call 'Foo::before'; my $after = after { if ( $_[0]->wantarray ) { push @CONTEXT, 'ARRAY'; } elsif ( defined $_[0]->wantarray ) { push @CONTEXT, 'SCALAR'; } else { push @CONTEXT, 'VOID'; } if ( wantarray ) { push @CONTEXT, 'ARRAY'; } elsif ( defined wantarray ) { push @CONTEXT, 'SCALAR'; } else { push @CONTEXT, 'VOID'; } } call 'Foo::after'; # During the aspects SCOPE: { () = Foo->before; my $dummy = Foo->before; Foo->before; } SCOPE: { () = Foo->after; my $dummy = Foo->after; Foo->after; } # Disable the aspects undef $before; undef $after; # After the aspects SCOPE: { () = Foo->before; my $dummy = Foo->before; Foo->before; } SCOPE: { () = Foo->after; my $dummy = Foo->after; Foo->after; } # Check the results in aggregate is_deeply( \@CONTEXT, [ qw{ array scalar void array scalar void ARRAY VOID array SCALAR VOID scalar VOID VOID void array ARRAY VOID scalar SCALAR VOID void VOID VOID array scalar void array scalar void } ], 'All wantarray contexts worked as expected for before', );