show single firing wizard for get
[p5sagit/Mutually-Assured-Destruction.git] / notes / strong-with-getonce.pl
CommitLineData
05c0ec94 1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5use Devel::GlobalDestruction ();
6use Scalar::Util ();
7use Variable::Magic ();
8use Carp ();
9
10BEGIN {
11 package Foo;
12
13 my $wiz;
14 $wiz = Variable::Magic::wizard
15 data => sub { $_[1] },
16 get => sub {
17 Carp::cluck "get fired";
18 Variable::Magic::dispell ${$_[0]}, $wiz;
19 };
20
21 sub DESTROY {
22 return if Devel::GlobalDestruction::in_global_destruction();
23 warn "DESTROY\n";
24
25 my $self = shift;
26
27 if (ref $self->{other_side} && $self->{other_side}{reference}) {
28 if (
29 Scalar::Util::refaddr($self->{other_side}{reference})
30 eq Scalar::Util::refaddr($self)
31 ) {
32 warn "Enlivening";
33 $self->{other_side}{reference} = $self;
34 Variable::Magic::cast $self->{other_side}{reference}, $wiz;
35 delete $self->{other_side};
36 }
37 }
38 }
39}
40
41my $near = {};
42my $far = $near->{reference} = bless({ other_side => $near }, 'Foo');
43warn $near->{reference};
44warn $far;
45Scalar::Util::weaken($near->{reference});
46warn "Setup done\n";
47undef($far);
48warn $near->{reference};
49warn $near->{reference};
50Scalar::Util::weaken($near->{reference});
51warn $near->{reference};