X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FScope%2FUpper.pm;h=66f225f8a3f60913f54734a1dd94b608bbeb6945;hb=371ac1f7b00e6de2149f97693fdcbbfe44388f43;hp=1e5f75dbf63826e0def54c7e004fcb5ded560273;hpb=4a54085f1cdf66a64b73531e5cacced8ade613c9;p=perl%2Fmodules%2FScope-Upper.git
diff --git a/lib/Scope/Upper.pm b/lib/Scope/Upper.pm
index 1e5f75d..66f225f 100644
--- a/lib/Scope/Upper.pm
+++ b/lib/Scope/Upper.pm
@@ -9,20 +9,20 @@ Scope::Upper - Act on upper scopes.
=head1 VERSION
-Version 0.01
+Version 0.04
=cut
our $VERSION;
BEGIN {
- $VERSION = '0.01';
+ $VERSION = '0.04';
}
=head1 SYNOPSIS
package X;
- use Scope::Upper qw/reap localize localize_elem/;
+ use Scope::Upper qw/reap localize localize_elem localize_delete/;
sub desc { shift->{desc} }
@@ -43,21 +43,43 @@ BEGIN {
my $x = do { no strict 'refs'; ${$pkg.'::x'} }; # Get the $x in the scope
CORE::warn($x->desc . ': ' . join('', @_));
} => 1;
+
+ localize_delete '@ARGV', $#ARGV => 1; # delete last @ARGV element
}
package Y;
{
X::set_tag('pie');
- # $x is now a X object
+ # $x is now a X object, and @ARGV has one element less
warn 'what'; # warns "pie: what at ..."
...
} # "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.
-Currently, you can hook an upper scope end, or localize variables and array/hash values in higher contexts.
+Currently, you can hook an upper scope end, or localize variables, array/hash values or deletions of elements in higher contexts.
=head1 FUNCTIONS
@@ -111,13 +133,75 @@ Similar to L but for array and hash elements.
If C<$what> is a glob, the slot to fill is determined from which type of reference C<$value> is ; otherwise it's inferred from the sigil.
C<$key> is either an array index or a hash key, depending of which kind of variable you localize.
-=head2 C
+=head2 C
+
+Similiar to L, but for deleting variables or array/hash elements.
+C<$what> can be:
+
+=over 4
+
+=item *
+
+A glob, in which case C<$key> is ignored and the call is equivalent to C.
+
+=item *
+
+A string beginning with C<'@'> or C<'%'>, for which the call is equivalent to respectiveley C and C.
+
+=item *
+
+A string beginning with C<'&'>, which more or less does C in the upper scope.
+It's actually more powerful, as C<&func> won't even C anymore.
+C<$key> is ignored.
+
+=back
+
+=head2 C
+
+Returns C<@values> I the context indicated by C<$level>, i.e. from the subroutine, eval or format just above C<$level>.
+The upper level isn't coerced onto C<@values>, which is hence always evaluated in list context.
+
+=head2 C
+
+Like C, but for the subroutine/eval/format context just above C<$level>.
+
+=head1 WORDS
+
+=head2 C
Returns the level that currently represents the highest scope.
+=head2 C
+
+The current level - i.e. C<0>.
+
+=head2 C
+
+The level of the scope just above C<$from>.
+
+=head2 C
+
+The level of the scope just below C<$from>.
+
+=head2 C
+
+The level of the closest subroutine context above C<$from>.
+
+=head2 C
+
+The level of the closest eval context above C<$from>.
+
+If C<$from> is omitted in any of those functions, the current level is used as the reference level.
+
+=head2 C
+
+The level corresponding to the stack referenced by C.
+
=head1 EXPORT
-The functions L, L, L and L are only exported on request, either individually or by the tags C<':funcs'> and C<':all'>.
+The functions L, L, L, L, L and L are only exported on request, either individually or by the tags C<':funcs'> and C<':all'>.
+
+Same goes for the words L, L, L, L, L, L and L that are only exported on request, individually or by the tags C<':words'> and C<':all'>.
=cut
@@ -125,7 +209,8 @@ use base qw/Exporter/;
our @EXPORT = ();
our %EXPORT_TAGS = (
- funcs => [ qw/reap localize localize_elem TOPLEVEL/ ],
+ funcs => [ qw/reap localize localize_elem localize_delete unwind want_at/ ],
+ words => [ qw/TOP HERE UP DOWN SUB EVAL CALLER/ ],
);
our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
$EXPORT_TAGS{'all'} = [ @EXPORT_OK ];
@@ -179,13 +264,15 @@ You can find documentation for this module with the perldoc command.
perldoc Scope::Upper
+Tests code coverage report is available at L.
+
=head1 ACKNOWLEDGEMENTS
Inspired by Ricardo Signes.
=head1 COPYRIGHT & LICENSE
-Copyright 2008 Vincent Pit, all rights reserved.
+Copyright 2008-2009 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.