use strict;
use warnings;
use Test::More;
{
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'), $method_object,
'original method object is preserved' );
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" );
undef $method_meta;
}
done_testing;