Commit | Line | Data |
dd944db5 |
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}; |