Hi,
I'm writing a some tests where I build some classes and objects on
the fly an add different roles to them.
Now, when I build two objects of the same class but add different
roles to them, the later created class does the role of the former
created class:
Sample code :
Superclass PW::BaseClass:
package PW::BaseClass;
use Moose;
1;
====================
Two roles , RoleA, RoleB
package PW::RoleA;
use Moose::Role;
sub bar {
__PACKAGE__
}
1;
================
package PW::RoleB;
use Moose::Role;
sub foo {
__PACKAGE__
}
1;
=================
Script:
#!/usr/bin/perl -w
use Moose::Meta::Class;
use PW::BaseClass;
my $product_meta = Moose::Meta::Class->create (
"PW::Subclass1",
superclasses => ['PW::BaseClass'],
roles => ['PW::RoleA'] ,
);
my $product = $product_meta->new_object( );
print ref($product), "\t", $product->bar, "\n";
print $product->does('PW::RoleA') ? "Does RoleA\n" : "Doesn't RoleA\n";
print $product->does('PW::RoleB') ? "Does RoleB\n" : "Doesn't RoleB\n";
print $product->does('PW::RoleC') ? "Does RoleC\n" : "Doesn't RoleC\n";
my $product_meta2 = Moose::Meta::Class->create (
"PW::Subclass1",
superclasses => ['PW::BaseClass'],
roles => ['PW::RoleB'] ,
);
my $product2 = $product_meta2->new_object( );
print ref($product2), "\t", $product2->foo, "\n";
print $product2->does('PW::RoleA') ? "Does RoleA\n" : "Doesn't RoleA\n";
print $product2->does('PW::RoleB') ? "Does RoleB\n" : "Doesn't RoleB\n";
print $product2->does('PW::RoleC') ? "Does RoleC\n" : "Doesn't RoleC\n";
====
Result :
PW::Subclass1 PW::RoleA
Does RoleA
Doesn't RoleB
Doesn't RoleC
PW::Subclass1 PW::RoleB
Does RoleA
Does RoleB
Doesn't RoleC
=============
So, why does $product2 RoleA ? Bug or feature ?
It works ok when I rename the package name for product2 to
PW::Subclass2.
Regards
Rolf Schaufelberger