2015-09-22 4 views
2

У меня есть код с использованием MooseX::Traits, который выполняет справедливую бит динамической загрузки ролей. Требование к настройке в одной из ролей не работает из-за зависимости ролей друг от друга. Есть правильный способ для достижения изображенных ниже, этот код умирает с died: Moose::Exception::RequiredMethodsNotImplementedByClass ('Constructor::Plugin' requires the method 'frobnicate' to be implemented by 'MooseX::Traits::__ANON__::SERIAL::1'Динамически построенные объекты с MooseX :: Черты

#!/usr/bin/perl                
package Constructor; 
use Moose; 
with 'MooseX::Traits'; 
use namespace::autoclean; 
has '+_trait_namespace' => (default => __PACKAGE__); 
sub load { 
    my ($class, $plugin) = @_; 
    my $obj_with_plugin = $class->new_with_traits(traits => ["$plugin"]); 
    return $obj_with_plugin; 
} 
__PACKAGE__->meta->make_immutable; 
1; 

package Constructor::Plugin; 
use Moose::Role; 
requires 'frobnicate'; 
with 'Constructor::Plugin::Component'; 
1; 

package Constructor::Plugin::Component; 
use Moose::Role; 
sub frobnicate { "zark!\n" } 

1; 
package main; 
use Test::More; 
use Test::Exception; 
my $thing; 
lives_ok {$thing = Constructor->load('Plugin')} "instantiated ok"; 
ok $thing->frobnicate, "frobnicates ok"; 
done_testing; 
+0

Все эти '1;' в вашем файле ничего не делают. – melpomene

+1

да, но если я хочу переместить вещи в структуру, то это еще одно дело забыть. – singingfish

ответ

1

Как о загрузке Конструктора :: Plugin :: Component через MooseX :: Признаков также?

#!/usr/bin/perl                
package Constructor; 
use Moose; 
with 'MooseX::Traits'; 
use namespace::autoclean; 
has '+_trait_namespace' => (default => __PACKAGE__); 
sub load { 
    my ($class, @plugin) = @_; 
    my $obj_with_plugin = $class->new_with_traits(traits => [@plugin]); 
    return $obj_with_plugin; 
} 
__PACKAGE__->meta->make_immutable; 
1; 

package Constructor::Plugin; 
use Moose::Role; 
requires 'frobnicate'; 
1; 

package Constructor::Plugin::Component; 
use Moose::Role; 
sub frobnicate { "zark!\n" } 
1; 

package main; 
use Test::More; 
use Test::Exception; 
my $thing; 
lives_ok {$thing = Constructor->load('Plugin', 'Plugin::Component')} "instantiated ok"; 
ok $thing->frobnicate, "frobnicates ok"; 
done_testing;