NAME
Devel::Unwind - What if you could die to a labeled eval?
SYNOPSIS
use Devel::Unwind;
$SIG{__DIE__} = sub { print "I die: @_" };
mark FOO {
unwind FOO;
};
mark FOO {
unwind FOO "foobar";
1;
} or do {
print "or do: $@";
};
mark FOO {
unwind FOO 1..5;
};
package BAR {
sub PROPAGATE {print "I propagate: @_\n"; $_[0]->[0]}
}
mark FOO {
$@ = bless ["baz"], "BAR";
unwind FOO;
}
DESCRIPTION
Imagine Perl had the ability to die to a labeled eval so that when you write
FOO: eval {...}
you could die to that labeled eval
die FOO "bar";
That is essentially what Devel::Unwind gives you. Two custom keywords 'mark','unwind' are added allowing you two write
use Devel::Unwind;
mark FOO {...} or do {...}
unwind FOO "bar";
unwind FOO "bar","baz";
unwind FOO (bless [], "Bar");
unwind FOO;
Wherever you would put a block 'eval' an 'mark' expression can be used. And wherever you would 'die' you can 'unwind'. If a $SIG{__DIE__} handler is installed then it gets called on 'unwind'. The arguments to 'unwind' are treated the same way as the arguments to 'die'. Multiple arguments are joined to togeter, a single argument is passed through untouched unless it is a object with PROPAGATE method in which case $@ gets replaced by the return value of that method. For details read the documentation of die.
AUTHORS
Andreas Guðmundsson andreasg@cpan.org