また、ロールを使用してMooseに実装されるクラスとインターフェイスのセットを作成しました。私が理解するのに苦労しているのは、Mooseの特性と役割の使用法と実装の両方の正確な違いです。
Mooseのドキュメントには次のように記載されています。
役割と特性は同じものであることを理解することが重要です。ロールはトレイトとして使用でき、トレイトはロールです。この2つを区別する唯一の点は、Mooseが短い名前をクラス名に解決できるようにトレイトがパッケージ化されていることです。つまり、トレイトを使用すると、呼び出し元は「Big」のような短い名前でそれを参照でき、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