Есть ли способ обеспечить зависимость между плагинами MooseX :: Traits во время создания объекта? - PullRequest
0 голосов
/ 06 сентября 2011

Скажем, у меня есть класс Foo с чертами / ролями плагина Bar и Baz, где Baz зависит от Bar.

package Foo;
use Moose;
with 'MooseX::Traits';
sub foo {print "foo\n"}

package Bar;
use Moose::Role;
sub bar {
    shift->foo; 
    print "bar\n";
}

package Baz;
use Moose::Role;
requires 'bar';
sub baz {
    shift->bar; 
    print "baz\n";
}

package main;
my $foo = Foo->new_with_traits( traits => [qw/Bar Baz/] );
$foo->baz;

В этом примере я установил зависимость с requires 'bar'. Однако я хочу, чтобы Baz требовал всей роли Bar для обеспечения зависимости между плагинами.

Есть ли простой способ сделать это? Или у вас есть предложение альтернативного подхода?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Имеет смысл сделать это так, как вы уже продемонстрировали.Это потому, что атрибутов и методов, которые предоставляет роль, должно быть достаточно, чтобы сделать ее совместимой с вашим интерфейсом.

Если бы вы зависели от конкретных ролей по имени, то вы, например, не смогли бы предоставить полиморфную роль с другим именем пакета, тогда как, если вы зависите от определенных атрибутов, доступных через интерфейс, вы можете.

1 голос
/ 09 сентября 2011

Все, что сказал кубабит, - правда. Лучше обеспечить зависимость от API, а не от конкретной имплментации или типа. Однако, чтобы ответить на ваш конкретный вопрос так, как вы бы связали Baz с требованием Bar, нужно просто составить Bar.

package Baz { 
    use Moose::Role;
    with qw(Bar);
    ...
}

Тогда вы просто использовали бы Baz в одиночку, когда сочинили его с Foo во время выполнения.

my $foo = Foo->with_traits('Baz')->new(...);

$foo, затем does() и Baz, и Bar.

...