...
} # "pie: done" is printed
+ package Z;
+
+ use Scope::Upper qw/unwind want_at :words/;
+
+ sub try (&) {
+ my @result = shift->();
+ my $cx = SUB UP SUB;
+ unwind +(want_at($cx) ? @result : scalar @result) => $cx;
+ }
+
+ ...
+
+ sub zap {
+ try {
+ return @things; # returns to try() and then outside zap()
+ }
+ }
+
+ my @what = zap(); # @what contains @things
+
=head1 DESCRIPTION
This module lets you defer actions that will take place when the control flow returns into an upper scope.
--- /dev/null
+#!perl
+
+use strict;
+use warnings;
+
+use blib;
+
+use Scope::Upper qw/unwind want_at :words/;
+
+sub try (&) {
+ my @result = shift->();
+ my $cx = SUB UP SUB;
+ unwind +(want_at($cx) ? @result : scalar @result) => $cx;
+}
+
+sub zap {
+ try {
+ my @things = qw/a b c/;
+ return @things; # returns to try() and then outside zap()
+ };
+ print "NOT REACHED\n";
+}
+
+my @what = zap(); # @what contains @things
+my $what = zap(); # @what contains @things
+
+print "zap() returns @what in list context and $what in scalar context\n";