test now doesn't run but is closer to the right structure
[p5sagit/Mutually-Assured-Destruction.git] / notes / saved-by-strength.pl
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5 use Devel::GlobalDestruction ();
6 use Scalar::Util ();
7
8 BEGIN {
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
30 my $near = {};
31 my $far = $near->{reference} = bless({ other_side => $near }, 'Foo');
32 warn $near->{reference};
33 warn $far;
34 Scalar::Util::weaken($near->{reference});
35 warn "Setup done\n";
36 undef($far);
37 warn $near->{reference};
38 Scalar::Util::weaken($near->{reference});
39 warn $near->{reference};