demonstrating how shit gets destroyed
[p5sagit/Mutually-Assured-Destruction.git] / notes / destruction-order.pl
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5 use Variable::Magic qw(wizard cast);
6
7 BEGIN { package Foo; sub DESTROY { warn "in DESTROY\n"; } }
8
9 my $wiz = wizard data => sub { $_[1] },
10                  free => sub { warn "destroyed $_[1]!\n"; };
11
12 {
13   warn "Stanza 1\n";
14
15   my %foo;
16   
17   my $foo = \%foo;
18   
19   bless($foo, 'Foo');
20   
21   cast $foo, $wiz, '$foo';
22   cast %foo, $wiz, '%foo';
23
24 }
25
26 {
27   warn "Stanza 2\n";
28   
29   my $foo = do {
30     my %foo;
31     cast %foo, $wiz, '%foo';
32     \%foo;
33   };
34   
35   bless($foo, 'Foo');
36   
37   cast $foo, $wiz, '$foo';
38
39   undef($foo);
40
41   warn "End of block\n";
42
43 }