X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F030_roles%2Ffailing%2F036_free_anonymous_roles.t;fp=t%2F030_roles%2Ffailing%2F036_free_anonymous_roles.t;h=7429765669473ac9d8fafbe6b1a4aaedca7265f3;hb=6719984210754e8d012ae678536f194c35000823;hp=0000000000000000000000000000000000000000;hpb=56a558f97f2da37b37db51a6a8ef7f923e84724e;p=gitmo%2FMouse.git diff --git a/t/030_roles/failing/036_free_anonymous_roles.t b/t/030_roles/failing/036_free_anonymous_roles.t new file mode 100644 index 0000000..7429765 --- /dev/null +++ b/t/030_roles/failing/036_free_anonymous_roles.t @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 4; +use Mouse (); +use Scalar::Util 'weaken'; + +my $weak; +my $name; +do { + my $anon_class; + + do { + my $role = Mouse::Meta::Role->create_anon_role( + methods => { + improperly_freed => sub { 1 }, + }, + ); + weaken($weak = $role); + + $name = $role->name; + + $anon_class = Mouse::Meta::Class->create_anon_class( + roles => [ $role->name ], + ); + }; + + ok($weak, "we still have the role metaclass because the anonymous class that consumed it is still alive"); + ok($name->can('improperly_freed'), "we have not blown away the role's symbol table"); +}; + +ok(!$weak, "the role metaclass is freed after its last reference (from a consuming anonymous class) is freed"); + +ok(!$name->can('improperly_freed'), "we blew away the role's symbol table entries");