X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FVariable%2FMagic.pm;h=7b4034c5b2a00892e4ffc0b1515c6cb12e9f4656;hb=079f8c8d79cff6d7cc2e467a0994a2a017f9f40f;hp=4359fef0976cc7c6b3ec1c4f4536a3259fad7f91;hpb=c1f14d9f670d6c298c7e120ea6e56cc764746537;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/lib/Variable/Magic.pm b/lib/Variable/Magic.pm index 4359fef..7b4034c 100644 --- a/lib/Variable/Magic.pm +++ b/lib/Variable/Magic.pm @@ -336,6 +336,48 @@ For example, if you want to call C each time the C<'TZ'> environme If you want to overcome the possible deletion of the C<'TZ'> entry, you have no choice but to rely on C uvar magic. +C can be called from any magical callback, and in particular from C. +This allows you to recursively cast magic on datastructures : + + my $wiz; + $wiz = wizard + data => sub { + my ($var, $depth) = @_; + $depth ||= 0; + my $r = ref $var; + if ($r eq 'ARRAY') { + &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for @$var; + } elsif ($r eq 'HASH') { + &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for values %$var; + } + return $depth; + }, + free => sub { + my ($var, $depth) = @_; + my $r = ref $var; + print "free $r at depth $depth\n"; + (); + }; + + { + my %h = ( + a => [ 1, 2 ], + b => { c => 3 } + ); + cast %h, $wiz; + } + +When C<%h> goes out of scope, this will print something among the lines of : + + free HASH at depth 0 + free HASH at depth 1 + free SCALAR at depth 2 + free ARRAY at depth 1 + free SCALAR at depth 3 + free SCALAR at depth 3 + +Of course, this example does nothing with the values that are added after the C. + =head2 C getdata [$@%&*]var, [$wiz|$sig]