#!/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";