X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;ds=inline;f=lib%2FVariable%2FMagic.pm;h=aa7ee22136d71a0c31849f6a0dafed9f9d761431;hb=fbbe2a83ed1d928afe5a634f01c1b653d7288d9c;hp=5f268a44b951fd6f5c2d280c536e4a9fe9438971;hpb=20763a0bc2e3d1987ead055b78ef2481aa18514c;p=perl%2Fmodules%2FVariable-Magic.git
diff --git a/lib/Variable/Magic.pm b/lib/Variable/Magic.pm
index 5f268a4..aa7ee22 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.27
+Version 0.28
=cut
our $VERSION;
BEGIN {
- $VERSION = '0.27';
+ $VERSION = '0.28';
}
=head1 SYNOPSIS
@@ -278,19 +278,20 @@ BEGIN {
=head2 C
- wizard sig => ...,
- data => sub { ... },
- get => sub { my ($ref, $data) = @_; ... },
- set => sub { my ($ref, $data) = @_; ... },
- len => sub { my ($ref, $data, $len) = @_; ... ; return $newlen; },
- clear => sub { my ($ref, $data) = @_; ... },
- free => sub { my ($ref, $data) = @_, ... },
- copy => sub { my ($ref, $data, $key, $elt) = @_; ... },
- local => sub { my ($ref, $data) = @_; ... },
- fetch => sub { my ($ref, $data, $key) = @_; ... },
- store => sub { my ($ref, $data, $key) = @_; ... },
- exists => sub { my ($ref, $data, $key) = @_; ... },
- delete => sub { my ($ref, $data, $key) = @_; ... }
+ wizard sig => ...,
+ data => sub { ... },
+ get => sub { my ($ref, $data) = @_; ... },
+ set => sub { my ($ref, $data) = @_; ... },
+ len => sub { my ($ref, $data, $len) = @_; ... ; return $newlen; },
+ clear => sub { my ($ref, $data) = @_; ... },
+ free => sub { my ($ref, $data) = @_, ... },
+ copy => sub { my ($ref, $data, $key, $elt) = @_; ... },
+ local => sub { my ($ref, $data) = @_; ... },
+ fetch => sub { my ($ref, $data, $key) = @_; ... },
+ store => sub { my ($ref, $data, $key) = @_; ... },
+ exists => sub { my ($ref, $data, $key) = @_; ... },
+ delete => sub { my ($ref, $data, $key) = @_; ... },
+ copy_key => $bool
This function creates a 'wizard', an opaque type that holds the magic information.
It takes a list of keys / values as argument, whose keys can be :
@@ -317,12 +318,38 @@ C<$_[0]> is a reference to the magic object and C<@_[1 .. @_-1]> are all extra a
C, C, C, C, C, C, C, C, C, C and C
-Code references to corresponding magic callbacks.
+Code references to the corresponding magic callbacks.
You don't have to specify all of them : the magic associated with undefined entries simply won't be hooked.
In those callbacks, C<$_[0]> is always a reference to the magic object and C<$_[1]> is always the private data (or C when no private data constructor was supplied).
-In the special case of C magic and when the variable is an array, C<$_[2]> contains its normal length.
-C<$_[2]> is the current key in C, C, C, C and C callbacks, although for C it may just be a copy of the actual key so it's useless to (for example) cast magic on it.
-C magic also receives the current element (i.e. the value) in C<$_[3]>.
+Other arguments are specific to the magic hooked :
+
+=over 8
+
+=item *
+
+C
+
+When the variable is an array, C<$_[2]> contains the normal length.
+The callback is also expected to return the new scalar or array length.
+
+=item *
+
+C
+
+C<$_[2]> is a either a copy or an alias of the current key, which means that it is useless to try to change or cast magic on it.
+C<$_[3]> is an alias to the current element (i.e. the value).
+
+=item *
+
+C, C, C and C
+
+C<$_[2]> is an alias to the current key.
+Nothing prevents you from changing it, but be aware that there lurk dangerous side effects.
+For example, it may righteously be readonly if the key was a bareword.
+You can get a copy instead by passing C<< copy_key => 1 >> to L, which allows you to safely assign to C<$_[2]> in order to e.g. redirect the action to another key.
+This however has a little performance drawback because of the copy.
+
+=back
All the callbacks are expected to return an integer, which is passed straight to the perl magic API.
However, only the return value of the C callback currently holds a meaning.
@@ -435,8 +462,6 @@ The only way to address this would be to return a reference.
If you define a wizard with a C callback and cast it on itself, this destructor won't be called because the wizard will be destroyed first.
-Using simultaneously C and C magics on hashes may cause segfaults.
-
=head1 DEPENDENCIES
L 5.7.3.