#!/usr/bin/env perl # # To get the filtered code, try this: # perl -c -MFilter::ExtractSource test.pl | grep -v '^use Try::Harder;' # use strict; use warnings; use lib './lib'; use Try::Harder; use Data::Dumper; print "BEGIN\n"; sub foo { my $z = 1; ;{ local $Try::Harder::TRY = sub { do { print "TRYING\n"; #return "YAAY!"; my $z = 8; die "EXCEPTION $z \n"; }; return $Try::Harder::SENTINEL; }; local $Try::Harder::CATCH = sub { do { print "CAUGHT: $@"; $z = 7; # should return this value from the sub #return "YAAY!!" }; return $Try::Harder::SENTINEL; }; local $Try::Harder::FINALLY = 'Try::Harder::ScopeGuard'->_new(sub { # should always output print "FINALLY, [$@]\n"; # finally doesn't support return return "IMPOSSIBLE!" }, @_); local ( $Try::Harder::ERROR, $Try::Harder::DIED, @Try::Harder::RETVAL ); local $Try::Harder::WANTARRAY = wantarray; { local $@; $Try::Harder::DIED = not eval { if ( $Try::Harder::WANTARRAY ) { @Try::Harder::RETVAL = &$Try::Harder::TRY; } elsif ( defined $Try::Harder::WANTARRAY ) { $Try::Harder::RETVAL[0] = &$Try::Harder::TRY; } else { &$Try::Harder::TRY; } return 1; }; $Try::Harder::ERROR = $@; }; if ( $Try::Harder::DIED ) { if ( $Try::Harder::CATCH ) { local $@ = $Try::Harder::ERROR; if ( $Try::Harder::WANTARRAY ) { @Try::Harder::RETVAL = &$Try::Harder::CATCH; } elsif ( defined $Try::Harder::WANTARRAY ) { $Try::Harder::RETVAL[0] = &$Try::Harder::CATCH; } else { &$Try::Harder::CATCH; } } else { die $Try::Harder::ERROR } }; if ( caller() and (!ref($Try::Harder::RETVAL[0]) or !$Try::Harder::RETVAL[0]->isa('Try::Harder::SENTINEL')) ) { return $Try::Harder::WANTARRAY ? @Try::Harder::RETVAL : $Try::Harder::RETVAL[0]; } } print "\$z = $z\n"; print "OOPS! $@\n"; return "FAIL"; } my $x = foo(); print "RETURNED: " . Dumper $x; # returning from outside a sub makes no sense. #try { print "TRYING AGAIN\n"; } #die "EXCEPTION\n" } ;{ local $Try::Harder::TRY = sub { do { print "TRYING AGAIN\n"; }; return $Try::Harder::SENTINEL; }; local $Try::Harder::CATCH = sub { do { print "CAUGHT: $@\n" }; return $Try::Harder::SENTINEL; }; local $Try::Harder::FINALLY = 'Try::Harder::ScopeGuard'->_new(sub { print "FINALLY: CAUGHT [$@]\n" }, @_); local ( $Try::Harder::ERROR, $Try::Harder::DIED, @Try::Harder::RETVAL ); local $Try::Harder::WANTARRAY = wantarray; { local $@; $Try::Harder::DIED = not eval { if ( $Try::Harder::WANTARRAY ) { @Try::Harder::RETVAL = &$Try::Harder::TRY; } elsif ( defined $Try::Harder::WANTARRAY ) { $Try::Harder::RETVAL[0] = &$Try::Harder::TRY; } else { &$Try::Harder::TRY; } return 1; }; $Try::Harder::ERROR = $@; }; if ( $Try::Harder::DIED ) { if ( $Try::Harder::CATCH ) { local $@ = $Try::Harder::ERROR; if ( $Try::Harder::WANTARRAY ) { @Try::Harder::RETVAL = &$Try::Harder::CATCH; } elsif ( defined $Try::Harder::WANTARRAY ) { $Try::Harder::RETVAL[0] = &$Try::Harder::CATCH; } else { &$Try::Harder::CATCH; } } else { die $Try::Harder::ERROR } }; if ( caller() and (!ref($Try::Harder::RETVAL[0]) or !$Try::Harder::RETVAL[0]->isa('Try::Harder::SENTINEL')) ) { return $Try::Harder::WANTARRAY ? @Try::Harder::RETVAL : $Try::Harder::RETVAL[0]; } } print "END\n";