Проверка роли лося против не лося - PullRequest
3 голосов
/ 31 августа 2010

скажем, у вас есть класс Moose, для которого требуется атрибут, который выполняет роль:

package MyMooseClass;
use Moose;

has 'a' => ( does => 'MyRole' );

Теперь я хотел бы создать экземпляр MyMooseClass следующим образом:

my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );

Где $ a_non_moose_stuff - это экземпляр класса, не принадлежащего музею, но реализующий необходимые методы ролей.

Есть ли способ заставить Moose проверить, соответствует ли мой $ a_non_moose_stuff этой роли, даже если он не реализован с использованием Moose?

1 Ответ

5 голосов
/ 31 августа 2010

Самое простое - использовать duck_type вместо роли для проверки вашего интерфейса. Duck_type - более слабое ограничение, в основном duck_type - это просто список методов, которые должен иметь объект. Например:

package MyMooseClass;
use Moose;
use Moose::Util::TypeConstraints qw/duck_type/;

has 'a' => (
  isa => duck_type(qw/method1 method1 some_other_method/),
);

См. Moose :: Util :: TypeConstraints и прокрутите немного вниз, пока не увидите запись для duck_type . Это ограничение было добавлено специально для решения этой проблемы.

Если вы собираетесь многократно использовать это ограничение, вы можете захотеть взглянуть на его создание в классе библиотеки типов, что будет способствовать повторному использованию. Проверьте MooseX :: Типы .

Кстати, хотя использование Hash Reference в конструкторе поддерживается, и в течение долгого времени, прежде чем Moose считался лучшей практикой, большинство известных мне авторов Moose пропускают его и просто предоставляют список параметров конструктора. Это немного меньше печатать и выглядит чище, на мой взгляд:

my $instance = MyClass->new(param1=>'val1', param2=>'val2');

Суть подхода Hash Reference заключалась в том, чтобы помочь решить некоторые неясности, которые действительно не случаются, когда вы используете Moose для создания объекта Perl. Поскольку Moose имеет дело со всеми этими образцами и церемониями для вас, на мой взгляд, в этом нет необходимости, хотя стили бывают разные. Мои два цента.

Полегче,

John

...