2 Scope::Upper - Act on upper scopes.
10 use Scope::Upper qw/reap localize localize_elem localize_delete :words/;
12 sub desc { shift->{desc} }
17 # First localize $x so that it gets destroyed last
18 localize '$x' => bless({ desc => $desc }, __PACKAGE__) => UP; # one scope up
22 my $x = do { no strict 'refs'; ${$pkg.'::x'} }; # Get the $x in the scope
23 print $x->desc . ": done\n";
24 } => SCOPE 1; # same as UP here
26 localize_elem '%SIG', '__WARN__' => sub {
28 my $x = do { no strict 'refs'; ${$pkg.'::x'} }; # Get the $x in the scope
29 CORE::warn($x->desc . ': ' . join('', @_));
30 } => UP CALLER 0; # same as UP here
32 # delete last @ARGV element
33 localize_delete '@ARGV', -1 => UP SUB HERE; # same as UP here
40 # $x is now a X object, and @ARGV has one element less
41 warn 'what'; # warns "pie: what at ..."
43 } # "pie: done" is printed
47 use Scope::Upper qw/unwind want_at :words/;
50 my @result = shift->();
52 unwind +(want_at($cx) ? @result : scalar @result) => $cx;
59 return @things; # returns to try() and then outside zap()
63 my @what = zap(); # @what contains @things
66 This module lets you defer actions that will take place when the control
67 flow returns into an upper scope. Currently, you can hook an upper scope
68 end, or localize variables, array/hash values or deletions of elements
69 in higher contexts. You can also return to an upper level and know which
70 context was in use then.
73 In all those functions, $context refers to the target scope.
75 You have to use one or a combination of "WORDS" to build the $context to
76 pass to these functions. This is needed in order to ensure that the
77 module still works when your program is ran in the debugger. Don't try
78 to use a raw value or things will get messy.
80 The only thing you can assume is that it is an *absolute* indicator of
81 the frame. This means that you can safely store it at some point and use
82 it when needed, and it will still denote the original scope.
84 "reap $callback, $context"
85 Add a destructor that calls $callback when the upper scope represented
88 "localize $what, $value, $context"
89 A "local" delayed to the time of first return into the upper scope
90 denoted by $context. $what can be :
92 * A glob, in which case $value can either be a glob or a reference.
93 "localize" follows then the same syntax as "local *x = $value". For
94 example, if $value is a scalar reference, then the "SCALAR" slot of
95 the glob will be set to $$value - just like "local *x = \1" sets $x
98 * A string beginning with a sigil, representing the symbol to localize
99 and to assign to. If the sigil is '$', "localize" follows the same
100 syntax as "local $x = $value", i.e. $value isn't dereferenced. For
103 localize '$x', \'foo' => HERE;
105 will set $x to a reference to the string 'foo'. Other sigils ('@',
106 '%', '&' and '*') require $value to be a reference of the
109 When the symbol is given by a string, it is resolved when the actual
110 localization takes place and not when "localize" is called. This
113 sub tag { localize '$x', $_[0] => UP }
115 will localize in the caller's namespace.
117 "localize_elem $what, $key, $value, $context"
118 Similar to "localize" but for array and hash elements. If $what is a
119 glob, the slot to fill is determined from which type of reference $value
120 is ; otherwise it's inferred from the sigil. $key is either an array
121 index or a hash key, depending of which kind of variable you localize.
123 "localize_delete $what, $key, $context"
124 Similiar to "localize", but for deleting variables or array/hash
125 elements. $what can be:
127 * A glob, in which case $key is ignored and the call is equivalent to
130 * A string beginning with '@' or '%', for which the call is equivalent
131 to respectiveley "local $a[$key]; delete $a[$key]" and "local
132 $h{$key}; delete $h{$key}".
134 * A string beginning with '&', which more or less does "undef &func"
135 in the upper scope. It's actually more powerful, as &func won't even
136 "exists" anymore. $key is ignored.
138 "unwind @values, $context"
139 Returns @values *from* the context pointed by $context, i.e. from the
140 subroutine, eval or format just above $context.
142 The upper context isn't coerced onto @values, which is hence always
143 evaluated in list context. This means that
146 my @a = ('a' .. 'z');
150 will set $num to 'z'. You can use "want_at" to handle these cases.
153 Like "wantarray", but for the subroutine/eval/format just above
156 The previous example can then be "corrected" :
159 my @a = ('a' .. 'z');
160 unwind +(want_at(HERE) ? @a : scalar @a) => HERE;
163 will righteously set $num to 26.
168 Returns the context that currently represents the highest scope.
171 The context of the current scope.
173 Getting a context from a context
174 For any of those functions, $from is expected to be a context. When
175 omitted, it defaults to the the current context.
178 The context of the scope just above $from.
181 The context of the closest subroutine above $from.
184 The context of the closest eval above $from.
186 Getting a context from a level
187 Here, $level should denote a number of scopes above the current one.
188 When omitted, it defaults to 0 and those functions return the same
192 The $level-th upper context, regardless of its type.
195 The context of the $level-th upper subroutine/eval/format. It kind of
196 corresponds to the context represented by "caller $level", but while
197 e.g. "caller 0" refers to the caller context, "CALLER 0" will refer to
198 the top scope in the current context.
201 The functions "reap", "localize", "localize_elem", "localize_delete",
202 "unwind" and "want_at" are only exported on request, either individually
203 or by the tags ':funcs' and ':all'.
205 Same goes for the words "TOP", "HERE", "UP", "SUB", "EVAL", "SCOPE" and
206 "CALLER" that are only exported on request, individually or by the tags
210 Be careful that local variables are restored in the reverse order in
211 which they were localized. Consider those examples:
215 reap sub { print $x } => HERE;
223 reap sub { $x = 2 } => HERE;
228 The first case is "solved" by moving the "local" before the "reap", and
229 the second by using "localize" instead of "reap".
231 "reap", "localize" and "localize_elem" effects can't cross "BEGIN"
232 blocks, hence calling those functions in "import" is deemed to be
233 useless. This is an hopeless case because "BEGIN" blocks are executed
234 once while localizing constructs should do their job at each run.
236 Some rare oddities may still happen when running inside the debugger. It
237 may help to use a perl higher than 5.8.9 or 5.10.0, as they contain some
241 XSLoader (standard since perl 5.006).
244 Alias, Hook::Scope, Scope::Guard, Guard.
247 Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.
249 You can contact me by mail or on "irc.perl.org" (vincent).
252 Please report any bugs or feature requests to "bug-scope-upper at
253 rt.cpan.org", or through the web interface at
254 <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Scope-Upper>. I will be
255 notified, and then you'll automatically be notified of progress on your
256 bug as I make changes.
259 You can find documentation for this module with the perldoc command.
263 Tests code coverage report is available at
264 <http://www.profvince.com/perl/cover/Scope-Upper>.
267 Inspired by Ricardo Signes.
269 Thanks to Shawn M. Moore for motivation.
272 Copyright 2008-2009 Vincent Pit, all rights reserved.
274 This program is free software; you can redistribute it and/or modify it
275 under the same terms as Perl itself.