Add failing test for anonymous method metaclass persistency
Shawn M Moore [Sat, 16 May 2009 15:02:31 +0000 (11:02 -0400)]
t/100_bugs/024_anon_method_metaclass.t [new file with mode: 0644]

diff --git a/t/100_bugs/024_anon_method_metaclass.t b/t/100_bugs/024_anon_method_metaclass.t
new file mode 100644 (file)
index 0000000..2b97cc8
--- /dev/null
@@ -0,0 +1,42 @@
+use strict;
+use warnings;
+use Test::More tests => 8;
+
+do {
+    package Ball;
+    use Moose;
+
+    package Arbitrary::Roll;
+    use Moose::Role;
+};
+
+my $method_meta = Moose::Meta::Class->create_anon_class(
+    superclasses => ['Moose::Meta::Method'],
+    roles        => ['Arbitrary::Roll'],
+);
+
+# For comparing identity without actually keeping $original_meta around
+my $original_meta = "$method_meta";
+
+my $method_class  = $method_meta->name;
+
+my $method_object = $method_class->wrap(
+    sub { 'ok' },
+    associated_metaclass => Ball->meta,
+    package_name         => 'Ball',
+    name                 => 'bounce',
+);
+
+Ball->meta->add_method(bounce => $method_object);
+
+for (1, 2) {
+    is(Ball->bounce, 'ok', "method still exists on Ball");
+    is(Ball->meta->get_method('bounce')->meta->name, $method_class, "method's package still exists");
+    is(Ball->meta->get_method('bounce')->meta . '', $original_meta, "method's metaclass still exists");
+    ok(Ball->meta->get_method('bounce')->meta->does_role('Arbitrary::Roll'), "method still does Arbitrary::Roll");
+
+    diag 'undef $method_meta' if $method_meta;
+    undef $method_meta;
+};
+
+