X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FVariable%2FMagic.pm;h=50ada382a335532c33bbffb9562d3f1eb117eae7;hb=4dd0e1a154147b46684ab875e7d052296b8ac629;hp=27e482c33c19639b6204c9b87317aa0b9fc740f3;hpb=4928f1e28fe3594d29e214901ac76c7975eea7e0;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/lib/Variable/Magic.pm b/lib/Variable/Magic.pm index 27e482c..50ada38 100644 --- a/lib/Variable/Magic.pm +++ b/lib/Variable/Magic.pm @@ -13,13 +13,13 @@ Variable::Magic - Associate user-defined magic to variables from Perl. =head1 VERSION -Version 0.29 +Version 0.30 =cut our $VERSION; BEGIN { - $VERSION = '0.29'; + $VERSION = '0.30'; } =head1 SYNOPSIS @@ -36,28 +36,49 @@ BEGIN { =head1 DESCRIPTION Magic is Perl way of enhancing objects. -This mechanism let the user add extra data to any variable and hook syntaxical operations (such as access, assignation or destruction) that can be applied to it. -With this module, you can add your own magic to any variable without the pain of the C API. +This mechanism lets the user add extra data to any variable and hook syntaxical operations (such as access, assignation or destruction) that can be applied to it. +With this module, you can add your own magic to any variable without having to write a single line of XS. -Magic differs from tieing and overloading in several ways : +You'll realize that these magic variables look a lot like tied variables. +It's not surprising, as tied variables are implemented as a special kind of magic, just like any 'irregular' Perl variable : scalars like C<$!>, C<$(> or C<$^W>, the C<%ENV> and C<%SIG> hashes, the C<@ISA> array, C and C lvalues, L variables... +They all share the same underlying C API, and this module gives you direct access to it. + +Still, the magic made available by this module differs from tieing and overloading in several ways : =over 4 =item * -Magic isn't copied on assignation (as for blessed references) : you attach it to variables, not values. +It isn't copied on assignation. + +You attach it to variables, not values (as for blessed references). =item * -It doesn't replace the original semantics : magic callbacks trigger before the original action take place, and can't prevent it to happen. +It doesn't replace the original semantics. + +Magic callbacks trigger before the original action take place, and can't prevent it to happen. +This makes catching individual events easier than with C, where you have to provide fallbacks methods for all actions by usually inheriting from the correct C class and overriding individual methods in your own class. =item * -It's mostly invisible at the Perl level : magical and non-magical variables cannot be distinguished with C, C or another trick. +It's type-agnostic. + +The same magic can be applied on scalars, arrays, hashes, subs or globs. +But the same hook (see below for a list) may trigger differently depending on the the type of the variable. =item * -It's notably faster, since perl's way of handling magic is lighter by nature, and there's no need for any method resolution. +It's mostly invisible at the Perl level. + +Magical and non-magical variables cannot be distinguished with C, C or another trick. + +=item * + +It's notably faster. + +Mainly because perl's way of handling magic is lighter by nature, and because there's no need for any method resolution. +Also, since you don't have to reimplement all the variable semantics, you only pay for what you actually use. =back @@ -423,6 +444,15 @@ If the variable isn't a hash, any C callback of the wizard is safely ignor my $x; die 'error' unless cast $x, $wiz; +The C argument can be an array or hash value. +Magic for those behaves like for any other scalar, except that it is dispelled when the entry is deleted from the container. +For example, if you want to call C each time the C<'TZ'> environment variable is changed in C<%ENV>, you can use : + + use POSIX; + cast $ENV{TZ}, wizard set => sub { POSIX::tzset(); () }; + +If you want to overcome the possible deletion of the C<'TZ'> entry, you have no choice but to rely on C uvar magic. + =head2 C getdata [$@%&*]var, [$wiz|$sig] @@ -470,8 +500,6 @@ our %EXPORT_TAGS = ( our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS; $EXPORT_TAGS{'all'} = [ @EXPORT_OK ]; -END { _cleanup() } - =head1 CAVEATS If you store a magic object in the private data slot, the magic won't be accessible by L since it's not copied by assignation.