X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FMutually-Assured-Destruction.git;a=blobdiff_plain;f=notes%2Fsaved-by-strength.pl;fp=notes%2Fsaved-by-strength.pl;h=cdad638df049a27cf51985ef20e278703a24e572;hp=0000000000000000000000000000000000000000;hb=dd944db57e1969dc93f5916c7f343d47ed9cba56;hpb=6c760df7dbe81d373e04fa8973c502068cf311ff diff --git a/notes/saved-by-strength.pl b/notes/saved-by-strength.pl new file mode 100644 index 0000000..cdad638 --- /dev/null +++ b/notes/saved-by-strength.pl @@ -0,0 +1,39 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Devel::GlobalDestruction (); +use Scalar::Util (); + +BEGIN { + package Foo; + + sub DESTROY { + return if Devel::GlobalDestruction::in_global_destruction(); + warn "DESTROY\n"; + + my $self = shift; + + if (ref $self->{other_side}) { + if ( + Scalar::Util::refaddr($self->{other_side}{reference}) + eq Scalar::Util::refaddr($self) + ) { + warn "Enlivening"; + $self->{other_side}{reference} = $self; + delete $self->{other_side}; + } + } + } +} + +my $near = {}; +my $far = $near->{reference} = bless({ other_side => $near }, 'Foo'); +warn $near->{reference}; +warn $far; +Scalar::Util::weaken($near->{reference}); +warn "Setup done\n"; +undef($far); +warn $near->{reference}; +Scalar::Util::weaken($near->{reference}); +warn $near->{reference};