diff options
Diffstat (limited to 't/roles/free_anonymous_roles.t')
-rw-r--r-- | t/roles/free_anonymous_roles.t | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/t/roles/free_anonymous_roles.t b/t/roles/free_anonymous_roles.t new file mode 100644 index 0000000..98ce5dc --- /dev/null +++ b/t/roles/free_anonymous_roles.t @@ -0,0 +1,62 @@ +use strict; +use warnings; +use Test::More; +use Moose (); +use Scalar::Util 'weaken'; + +my $weak; +my $name; +do { + my $anon_class; + + do { + my $role = Moose::Meta::Role->create_anon_role( + methods => { + improperly_freed => sub { 1 }, + }, + ); + weaken($weak = $role); + + $name = $role->name; + + $anon_class = Moose::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"); + +do { + my $anon_class; + + do { + my $role = Moose::Meta::Role->create_anon_role( + methods => { + improperly_freed => sub { 1 }, + }, + weaken => 0, + ); + weaken($weak = $role); + + $name = $role->name; + + $anon_class = Moose::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 still exists because we told it not to weaken"); + +ok($name->can('improperly_freed'), "the symbol table still exists too"); + +done_testing; |