Я написал набор классов и интерфейсов, которые реализованы в Moose, также используя роли. То, что мне трудно понять, - это точные различия как в использовании, так и в реализации признаков лося по сравнению с ролями.
Документация Moose гласит:
Важно понимать, что роли и черты - одно и то же. Роль может использоваться как признак, и черта - это роль. Единственное, что отличает их, - это то, что черта упакована таким образом, что позволяет Moose разрешить короткое имя имени класса. Другими словами, с признаком, вызывающий может ссылаться на него по короткому имени, например "Большой", и Лось разрешит его для класса, такого как MooseX:: Embiggen:: Meta:: Attribute:: Role:: Big.
Я понимаю, что черты и роли "одинаковы". Однако при реализации базового теста идеи, использующей синтаксис use Moose -traits 'Foo'
, похоже, не делает того, чего я ожидал бы. Конечно, я должен что-то упустить.
Этот первый пример завершился неудачей: "Не удается найти метод объекта" foo ""
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->foo(); #Can't locate object method 'foo'
По сравнению с этим (что работает):
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose;
with 'MyApp::Meta::Class::Trait::HasTable';
__PACKAGE__->foo(); #foo