From: Vincent Pit Date: Tue, 21 Jul 2015 16:00:13 +0000 (-0300) Subject: This is 0.58 X-Git-Tag: v0.58^0 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FVariable-Magic.git;a=commitdiff_plain;h=fd95773479714bce7f8578528e0172c37a4cf2d8 This is 0.58 --- diff --git a/Changes b/Changes index 7591b34..3108d12 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,15 @@ 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 diff --git a/META.json b/META.json index 135f085..53760d6 100644 --- a/META.json +++ b/META.json @@ -4,7 +4,7 @@ "Vincent Pit " ], "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_5" ], @@ -66,5 +66,6 @@ "url" : "http://git.profvince.com/?p=perl%2Fmodules%2FVariable-Magic.git" } }, - "version" : "0.57" + "version" : "0.58", + "x_serialization_backend" : "JSON::PP version 2.27300" } diff --git a/META.yml b/META.yml index 386a77d..14a21aa 100644 --- a/META.yml +++ b/META.yml @@ -20,7 +20,7 @@ configure_requires: 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 @@ -41,4 +41,5 @@ resources: 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' diff --git a/README b/README index b10ea32..fc1ea92 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ NAME Variable::Magic - Associate user-defined magic to variables from Perl. VERSION - Version 0.57 + Version 0.58 SYNOPSIS use Variable::Magic qw; @@ -265,10 +265,17 @@ FUNCTIONS 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 : @@ -501,6 +508,45 @@ COOKBOOK 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. diff --git a/lib/Variable/Magic.pm b/lib/Variable/Magic.pm index 7c86649..2de79bc 100644 --- a/lib/Variable/Magic.pm +++ b/lib/Variable/Magic.pm @@ -11,13 +11,13 @@ Variable::Magic - Associate user-defined magic to variables from Perl. =head1 VERSION -Version 0.57 +Version 0.58 =cut our $VERSION; BEGIN { - $VERSION = '0.57'; + $VERSION = '0.58'; } =head1 SYNOPSIS