Если это - веб-приложение тогда могли бы быть преимущества для хранения изображений на сторонней сбытовой сети устройства хранения данных, таких как S3 Amazon или платформа Nirvanix.
Это единственное различие в том, как Лось использует термины «Черта» и «Роль».
В документации и API Moose часто используется термин «черты» как «Применяемые роли.
в метаклассы ". В вашем пересмотренном ответе ваш первый пример применяет роль к
MyApp :: User
метакласс через -traits
, второй пример применяет его к
class.
Если вы измените свой первый пример на:
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__->meta->foo();
, вы увидите " foo в [script]. line 3.
" Это именно то, что он должен был
делаю.
ОБНОВЛЕНИЕ: Видимо, я здесь не совсем прав. Черты - это роли, применяемые к экземплярам. Хук -traits
применяет HasTable к экземпляру метакласса для MyApp :: User. Я обновил соответствующие документы Moose.
You don't define a package 'x::Foo' with any role. Ripped straight from the documentation, we see that register_implementation
returns the name of an actually defined package:
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
has table => (
is => 'rw',
isa => 'Str',
);
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->meta->table('User');
The "shortcut" is achieved by Moose looking for "Moose::Meta::Class::Trait::$trait_name"
(when called in a "class context"), not just passing back a shorter name.