]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - README
This is 0.10
[perl/modules/Scope-Upper.git] / README
1 NAME
2     Scope::Upper - Act on upper scopes.
3
4 VERSION
5     Version 0.10
6
7 SYNOPSIS
8         package X;
9
10         use Scope::Upper qw/reap localize localize_elem localize_delete :words/;
11
12         sub desc { shift->{desc} }
13
14         sub set_tag {
15          my ($desc) = @_;
16
17          # First localize $x so that it gets destroyed last
18          localize '$x' => bless({ desc => $desc }, __PACKAGE__) => UP; # one scope up
19
20          reap sub {
21           my $pkg = caller;
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
25
26          localize_elem '%SIG', '__WARN__' => sub {
27           my $pkg = caller;
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
31
32          # delete last @ARGV element
33          localize_delete '@ARGV', -1 => UP SUB HERE; # same as UP here
34         }
35
36         package Y;
37
38         {
39          X::set_tag('pie');
40          # $x is now a X object, and @ARGV has one element less
41          warn 'what'; # warns "pie: what at ..."
42          ...
43         } # "pie: done" is printed
44
45         package Z;
46
47         use Scope::Upper qw/unwind want_at :words/;
48
49         sub try (&) {
50          my @result = shift->();
51          my $cx = SUB UP SUB;
52          unwind +(want_at($cx) ? @result : scalar @result) => $cx;
53         }
54
55         ...
56
57         sub zap {
58          try {
59           return @things; # returns to try() and then outside zap()
60           # not reached
61          }
62          # not reached
63         }
64
65         my @what = zap(); # @what contains @things
66
67 DESCRIPTION
68     This module lets you defer actions *at run-time* that will take place
69     when the control flow returns into an upper scope. Currently, you can:
70
71     *   hook an upper scope end with "reap" ;
72
73     *   localize variables, array/hash values or deletions of elements in
74         higher contexts with respectively "localize", "localize_elem" and
75         "localize_delete" ;
76
77     *   return values immediately to an upper level with "unwind", and know
78         which context was in use then with "want_at".
79
80 FUNCTIONS
81     In all those functions, $context refers to the target scope.
82
83     You have to use one or a combination of "WORDS" to build the $context
84     passed to these functions. This is needed in order to ensure that the
85     module still works when your program is ran in the debugger. The only
86     thing you can assume is that it is an *absolute* indicator of the frame,
87     which means that you can safely store it at some point and use it when
88     needed, and it will still denote the original scope.
89
90   "reap $callback, $context"
91     Add a destructor that calls $callback (in void context) when the upper
92     scope represented by $context ends.
93
94   "localize $what, $value, $context"
95     A "local" delayed to the time of first return into the upper scope
96     denoted by $context. $what can be :
97
98     *   A glob, in which case $value can either be a glob or a reference.
99         "localize" follows then the same syntax as "local *x = $value". For
100         example, if $value is a scalar reference, then the "SCALAR" slot of
101         the glob will be set to $$value - just like "local *x = \1" sets $x
102         to 1.
103
104     *   A string beginning with a sigil, representing the symbol to localize
105         and to assign to. If the sigil is '$', "localize" follows the same
106         syntax as "local $x = $value", i.e. $value isn't dereferenced. For
107         example,
108
109             localize '$x', \'foo' => HERE;
110
111         will set $x to a reference to the string 'foo'. Other sigils ('@',
112         '%', '&' and '*') require $value to be a reference of the
113         corresponding type.
114
115         When the symbol is given by a string, it is resolved when the actual
116         localization takes place and not when "localize" is called. This
117         means that
118
119             sub tag { localize '$x', $_[0] => UP }
120
121         will localize in the caller's namespace.
122
123   "localize_elem $what, $key, $value, $context"
124     Similar to "localize" but for array and hash elements. If $what is a
125     glob, the slot to fill is determined from which type of reference $value
126     is ; otherwise it's inferred from the sigil. $key is either an array
127     index or a hash key, depending of which kind of variable you localize.
128
129   "localize_delete $what, $key, $context"
130     Similiar to "localize", but for deleting variables or array/hash
131     elements. $what can be:
132
133     *   A glob, in which case $key is ignored and the call is equivalent to
134         "local *x".
135
136     *   A string beginning with '@' or '%', for which the call is equivalent
137         to respectiveley "local $a[$key]; delete $a[$key]" and "local
138         $h{$key}; delete $h{$key}".
139
140     *   A string beginning with '&', which more or less does "undef &func"
141         in the upper scope. It's actually more powerful, as &func won't even
142         "exists" anymore. $key is ignored.
143
144   "unwind @values, $context"
145     Returns @values *from* the context pointed by $context, i.e. from the
146     subroutine, eval or format just above $context, and immediately restart
147     the program flow at this point - thus effectively returning to (or from,
148     depending on how you see it) an upper context.
149
150     The upper context isn't coerced onto @values, which is hence always
151     evaluated in list context. This means that
152
153         my $num = sub {
154          my @a = ('a' .. 'z');
155          unwind @a => HERE;
156          # not reached
157         }->();
158
159     will set $num to 'z'. You can use "want_at" to handle these cases.
160
161   "want_at $context"
162     Like "wantarray", but for the subroutine/eval/format just above
163     $context.
164
165     The previous example can then be "corrected" :
166
167         my $num = sub {
168          my @a = ('a' .. 'z');
169          unwind +(want_at(HERE) ? @a : scalar @a) => HERE;
170          # not reached
171         }->();
172
173     will rightfully set $num to 26.
174
175 CONSTANTS
176   "SU_THREADSAFE"
177     True iff the module could have been built when thread-safety features.
178
179 WORDS
180   Constants
181    "TOP"
182     Returns the context that currently represents the highest scope.
183
184    "HERE"
185     The context of the current scope.
186
187   Getting a context from a context
188     For any of those functions, $from is expected to be a context. When
189     omitted, it defaults to the the current context.
190
191    "UP $from"
192     The context of the scope just above $from.
193
194    "SUB $from"
195     The context of the closest subroutine above $from. Note that $from is
196     returned if it is already a subroutine context ; hence "SUB SUB == SUB".
197
198    "EVAL $from"
199     The context of the closest eval above $from. Note that $from is returned
200     if it is already an eval context ; hence "EVAL EVAL == EVAL".
201
202   Getting a context from a level
203     Here, $level should denote a number of scopes above the current one.
204     When omitted, it defaults to 0 and those functions return the same
205     context as "HERE".
206
207    "SCOPE $level"
208     The $level-th upper context, regardless of its type.
209
210    "CALLER $level"
211     The context of the $level-th upper subroutine/eval/format. It kind of
212     corresponds to the context represented by "caller $level", but while
213     e.g. "caller 0" refers to the caller context, "CALLER 0" will refer to
214     the top scope in the current context.
215
216   Examples
217     Where "reap" fires depending on the $cxt :
218
219         sub {
220          eval {
221           sub {
222            {
223             reap \&cleanup => $cxt;
224             ...
225            }     # $cxt = SCOPE(0), or HERE
226            ...
227           }->(); # $cxt = SCOPE(1), or UP, or SUB, or CALLER, or CALLER(0)
228           ...
229          };      # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1)
230          ...
231         }->();   # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
232         ...
233
234     Where "localize", "localize_elem" and "localize_delete" act depending on
235     the $cxt :
236
237         sub {
238          eval {
239           sub {
240            {
241             localize '$x' => 1 => $cxt;
242             # $cxt = SCOPE(0), or HERE
243             ...
244            }
245            # $cxt = SCOPE(1), or UP, or SUB, or CALLER, or CALLER(0)
246            ...
247           }->();
248           # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1)
249           ...
250          };
251          # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
252          ...
253         }->();
254         # $cxt = SCOPE(4), UP SUB UP SUB, or UP SUB EVAL, or UP CALLER(2), or TOP
255         ...
256
257     Where "unwind" and "want_at" point to depending on the $cxt:
258
259         sub {
260          eval {
261           sub {
262            {
263             unwind @things => $cxt;
264             ...
265            }
266            ...
267           }->(); # $cxt = SCOPE(0 .. 1), or HERE, or UP, or SUB, or CALLER(0)
268           ...
269          };      # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1)
270          ...
271         }->();   # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
272         ...
273
274 EXPORT
275     The functions "reap", "localize", "localize_elem", "localize_delete",
276     "unwind" and "want_at" are only exported on request, either individually
277     or by the tags ':funcs' and ':all'.
278
279     The constant "SU_THREADSAFE" is also only exported on request,
280     individually or by the tags ':consts' and ':all'.
281
282     Same goes for the words "TOP", "HERE", "UP", "SUB", "EVAL", "SCOPE" and
283     "CALLER" that are only exported on request, individually or by the tags
284     ':words' and ':all'.
285
286 CAVEATS
287     Be careful that local variables are restored in the reverse order in
288     which they were localized. Consider those examples:
289
290         local $x = 0;
291         {
292          reap sub { print $x } => HERE;
293          local $x = 1;
294          ...
295         }
296         # prints '0'
297         ...
298         {
299          local $x = 1;
300          reap sub { $x = 2 } => HERE;
301          ...
302         }
303         # $x is 0
304
305     The first case is "solved" by moving the "local" before the "reap", and
306     the second by using "localize" instead of "reap".
307
308     The effects of "reap", "localize" and "localize_elem" can't cross
309     "BEGIN" blocks, hence calling those functions in "import" is deemed to
310     be useless. This is an hopeless case because "BEGIN" blocks are executed
311     once while localizing constructs should do their job at each run.
312     However, it's possible to hook the end of the current scope compilation
313     with B::Hooks::EndOfScope.
314
315     Some rare oddities may still happen when running inside the debugger. It
316     may help to use a perl higher than 5.8.9 or 5.10.0, as they contain some
317     context-related fixes.
318
319 DEPENDENCIES
320     XSLoader (standard since perl 5.006).
321
322 SEE ALSO
323     Alias, Hook::Scope, Scope::Guard, Guard.
324
325     Continuation::Escape is a thin wrapper around Scope::Upper that gives
326     you a continuation passing style interface to "unwind". It's easier to
327     use, but it requires you to have control over the scope where you want
328     to return.
329
330 AUTHOR
331     Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.
332
333     You can contact me by mail or on "irc.perl.org" (vincent).
334
335 BUGS
336     Please report any bugs or feature requests to "bug-scope-upper at
337     rt.cpan.org", or through the web interface at
338     <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Scope-Upper>. I will be
339     notified, and then you'll automatically be notified of progress on your
340     bug as I make changes.
341
342 SUPPORT
343     You can find documentation for this module with the perldoc command.
344
345         perldoc Scope::Upper
346
347     Tests code coverage report is available at
348     <http://www.profvince.com/perl/cover/Scope-Upper>.
349
350 ACKNOWLEDGEMENTS
351     Inspired by Ricardo Signes.
352
353     Thanks to Shawn M. Moore for motivation.
354
355 COPYRIGHT & LICENSE
356     Copyright 2008,2009,2010 Vincent Pit, all rights reserved.
357
358     This program is free software; you can redistribute it and/or modify it
359     under the same terms as Perl itself.
360