Revision history for Variable-Magic
+0.58 2015-07-21 16:00 UTC
+ + Add : If a non-len magic callback returns a reference, it will now
+ only be freed at the end of the statement that caused the
+ magic to trigger. This allows the user to attach free magic
+ (or a plain destructor) to a token returned from the callbacks
+ in order to defer an action after the magic is processed by
+ perl.
+ + Fix : Test failures of threads tests on systems with harsh resource
+ constraints causing the threads to exit() during run.
+
0.57 2015-04-17 15:20 UTC
+ Chg : The new environment variable to enable thread tests on older
perls is PERL_FORCE_TEST_THREADS. Note that this variable
Config: '0'
ExtUtils::MakeMaker: '0'
dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 7.04, CPAN::Meta::Converter version 2.150001'
+generated_by: 'ExtUtils::MakeMaker version 7.0401, CPAN::Meta::Converter version 2.150005'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
homepage: http://search.cpan.org/dist/Variable-Magic/
license: http://dev.perl.org/licenses/
repository: http://git.profvince.com/?p=perl%2Fmodules%2FVariable-Magic.git
-version: '0.57'
+version: '0.58'
+x_serialization_backend: 'CPAN::Meta::YAML version 0.016'
Variable::Magic - Associate user-defined magic to variables from Perl.
VERSION
- Version 0.57
+ Version 0.58
SYNOPSIS
use Variable::Magic qw<wizard cast VMG_OP_INFO_NAME>;
Both result in a small performance hit, but just getting the name is
lighter than getting the op object.
- These callbacks are executed in scalar context and are expected to
- return an integer, which is then passed straight to the perl magic
- API. However, only the return value of the *len* magic callback
- currently holds a meaning.
+ These callbacks are always executed in scalar context. The returned
+ value is coerced into a signed integer, which is then passed
+ straight to the perl magic API. However, note that perl currently
+ only cares about the return value of the *len* magic callback and
+ ignores all the others. Starting with Variable::Magic 0.58, a
+ reference returned from a non-*len* magic callback will not be
+ destroyed immediately but will be allowed to survive until the end
+ of the statement that triggered the magic. This lets you use this
+ return value as a token for triggering a destructor after the
+ original magic action takes place. You can see an example of this
+ technique in the cookbook.
Each callback can be specified as :
Of course, this example does nothing with the values that are added
after the "cast".
+ Delayed magic actions
+ Starting with Variable::Magic 0.58, the return value of the magic
+ callbacks can be used to delay the action until after the original
+ action takes place :
+
+ my $delayed;
+ my $delayed_aux = wizard(
+ data => sub { $_[1] },
+ free => sub {
+ my ($target) = $_[1];
+ my $target_data = &getdata($target, $delayed);
+ local $target_data->{guard} = 1;
+ if (ref $target eq 'SCALAR') {
+ my $orig = $$target;
+ $$target = $target_data->{mangler}->($orig);
+ }
+ return;
+ },
+ );
+ $delayed = wizard(
+ data => sub {
+ return +{ guard => 0, mangler => $_[1] };
+ },
+ set => sub {
+ return if $_[1]->{guard};
+ my $token;
+ cast $token, $delayed_aux, $_[0];
+ return \$token;
+ },
+ );
+ my $x = 1;
+ cast $x, $delayed => sub { $_[0] * 2 };
+ $x = 2;
+ # $x is now 4
+ # But note that the delayed action only takes place at the end of the
+ # current statement :
+ my @y = ($x = 5, $x);
+ # $x is now 10, but @y is (5, 5)
+
PERL MAGIC HISTORY
The places where magic is invoked have changed a bit through perl
history. Here is a little list of the most recent ones.