demonstrating how shit gets destroyed
[p5sagit/Mutually-Assured-Destruction.git] / notes / destruction-order.pl
diff --git a/notes/destruction-order.pl b/notes/destruction-order.pl
new file mode 100644 (file)
index 0000000..6d465f8
--- /dev/null
@@ -0,0 +1,43 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Variable::Magic qw(wizard cast);
+
+BEGIN { package Foo; sub DESTROY { warn "in DESTROY\n"; } }
+
+my $wiz = wizard data => sub { $_[1] },
+                 free => sub { warn "destroyed $_[1]!\n"; };
+
+{
+  warn "Stanza 1\n";
+
+  my %foo;
+  
+  my $foo = \%foo;
+  
+  bless($foo, 'Foo');
+  
+  cast $foo, $wiz, '$foo';
+  cast %foo, $wiz, '%foo';
+
+}
+
+{
+  warn "Stanza 2\n";
+  
+  my $foo = do {
+    my %foo;
+    cast %foo, $wiz, '%foo';
+    \%foo;
+  };
+  
+  bless($foo, 'Foo');
+  
+  cast $foo, $wiz, '$foo';
+
+  undef($foo);
+
+  warn "End of block\n";
+
+}