making a weak ref strong
[p5sagit/Mutually-Assured-Destruction.git] / notes / saved-by-strength.pl
CommitLineData
dd944db5 1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5use Devel::GlobalDestruction ();
6use Scalar::Util ();
7
8BEGIN {
9 package Foo;
10
11 sub DESTROY {
12 return if Devel::GlobalDestruction::in_global_destruction();
13 warn "DESTROY\n";
14
15 my $self = shift;
16
17 if (ref $self->{other_side}) {
18 if (
19 Scalar::Util::refaddr($self->{other_side}{reference})
20 eq Scalar::Util::refaddr($self)
21 ) {
22 warn "Enlivening";
23 $self->{other_side}{reference} = $self;
24 delete $self->{other_side};
25 }
26 }
27 }
28}
29
30my $near = {};
31my $far = $near->{reference} = bless({ other_side => $near }, 'Foo');
32warn $near->{reference};
33warn $far;
34Scalar::Util::weaken($near->{reference});
35warn "Setup done\n";
36undef($far);
37warn $near->{reference};
38Scalar::Util::weaken($near->{reference});
39warn $near->{reference};