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






Reply via email to