upper scope frames.
VERSION
- Version 0.02
+ Version 0.03
SYNOPSIS
use Scope::Context;
for (1 .. 5) {
sub {
eval {
- # Create Scope::Context objects for different upper frames.
- my ($block, $sub, $eval, $loop);
+ # Create Scope::Context objects for different upper frames :
+ my ($block, $eval, $sub, $loop);
{
$block = Scope::Context->new;
- $sub = $block->sub; # = $block->up
- $eval = $block->eval; # = $block->up(2)
- $loop = $eval->up; # = $block->up(3)
+ $eval = $block->eval; # == $block->up
+ $sub = $block->sub; # == $block->up(2)
+ $loop = $sub->up; # == $block->up(3)
}
eval {
- # This will throw an exception, since $block has expired.
+ # This throws an exception, since $block has expired :
$block->localize('$x' => 1);
};
- # This prints "hello" when the eval block above ends.
+ # This will print "hello" when the current eval block ends :
$eval->reap(sub { print "hello\n" });
- # Ignore $SIG{__DIE__} just for the loop body.
- $loop->localize_delete('%SIG', '__DIE__');
+ # Ignore warnings just for the loop body :
+ $loop->localize_elem('%SIG', __WARN__ => sub { });
- # Execute the callback as if it ran in place of the sub.
+ # Execute the callback as if it ran in place of the sub :
my @values = $sub->uplevel(sub {
return @_, 2;
}, 1);
+ # @values now contains (1, 2).
- # Immediately return (1, 2, 3) from the sub, bypassing the eval.
+ # Immediately return (1, 2, 3) from the sub, bypassing the eval :
$sub->unwind(@values, 3);
# Not reached.
# Not reached.
}->();
- # unwind() returns here. "hello\n" was printed, and now
- # $SIG{__DIE__} is undefined.
+ # unwind() returns here. "hello\n" was printed, and now warnings are
+ # ignored.
}
+ # $SIG{__WARN__} has been restored to its original value, warnings are no
+ # longer ignored.
+
DESCRIPTION
This class provides an object-oriented interface to Scope::Upper's
functionalities. A Scope::Context object represents a currently active
"gimme"
$cxt->gimme;
- Returns the context (in the sense of "wantarray" in perlfunc) in which
+ Returns the context (in the sense of "perlfunc/wantarray" : "undef" for
+ void context, '' for scalar context, and true for list context) in which
the scope denoted by the invocant is executed.
"eval_text"
"want"
my $want = $cxt->want;
- Returns the Perl context (in the sense of "wantarray" : "undef" for void
- context, '' for scalar context, and true for list context) in which is
- executed the scope pointed by the invocant.
+ Returns the Perl context (in the sense of "perlfunc/wantarray") in which
+ is executed the closest subroutine, eval or format enclosing the scope
+ pointed by the invocant.
"up"
my $up_cxt = $cxt->up;
sub {
{
{
- my $up = Scope::Context->new->up(2); # = Scope::Context->up(2)
+ my $up = Scope::Context->new->up(2); # == Scope::Context->up(2)
# $up points two contextes above this one, which is the sub.
}
}
my $sub_cxt = $cxt->sub($frames);
my $sub_cxt = Scope::Context->sub;
- Returns a new Scope::Context object pointing to the $frames-th
+ Returns a new Scope::Context object pointing to the "$frames + 1"-th
subroutine scope above the scope pointed by the invocant.
This method can also be invoked as a class method, in which case it is
}
sub inner {
- my $sub = Scope::Context->new->sub(1); # = Scope::Context->sub(1)
+ my $sub = Scope::Context->new->sub(1); # == Scope::Context->sub(1)
# $sub points to the context for the outer() sub.
}
my $eval_cxt = $cxt->eval($frames);
my $eval_cxt = Scope::Context->eval;
- Returns a new Scope::Context object pointing to the $frames-th "eval"
- scope above the scope pointed by the invocant.
+ Returns a new Scope::Context object pointing to the "$frames + 1"-th
+ "eval" scope above the scope pointed by the invocant.
This method can also be invoked as a class method, in which case it is
equivalent to calling "eval" on a Scope::Context object for the current
eval {
sub {
- my $eval = Scope::Context->new->eval; # = Scope::Context->eval
+ my $eval = Scope::Context->new->eval; # == Scope::Context->eval
# $eval points to the eval context.
}->()
}
"reap"
$cxt->reap($code);
- Execute $code when the scope pointed by the invocant ends.
+ Executes $code when the scope pointed by the invocant ends.
See "reap" in Scope::Upper for details.
"localize"
$cxt->localize($what, $value);
- Localize the variable described by $what to the value $value when the
- control flow returns to the scope pointed by the invocant.
+ Localizes the variable described by $what to the value $value when the
+ control flow returns to the scope pointed by the invocant, until said
+ scope ends.
See "localize" in Scope::Upper for details.
"localize_elem"
$cxt->localize_elem($what, $key, $value);
- Localize the element $key of the variable $what to the value $value when
- the control flow returns to the scope pointed by the invocant.
+ Localizes the element $key of the variable $what to the value $value
+ when the control flow returns to the scope pointed by the invocant,
+ until said scope ends.
See "localize_elem" in Scope::Upper for details.
"localize_delete"
$cxt->localize_delete($what, $key);
- Delete the element $key from the variable $what when the control flow
- returns to the scope pointed by the invocant.
+ Deletes the element $key from the variable $what when the control flow
+ returns to the scope pointed by the invocant, and restores it to its
+ original value when said scope ends.
See "localize_delete" in Scope::Upper for details.
See "uplevel" in Scope::Upper for details.
DEPENDENCIES
- Carp (core module since perl 5), Scalar::Util (since 5.7.3).
+ Carp (core module since perl 5), overload (since 5.2.0), Scalar::Util
+ (since 5.7.3).
Scope::Upper 0.21.
perldoc Scope::Context
COPYRIGHT & LICENSE
- Copyright 2011,2012,2013 Vincent Pit, all rights reserved.
+ Copyright 2011,2012,2013,2015 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.