3

ロールを実行する属性を必要とするMooseクラスがあるとします。

package MyMooseClass;
use Moose;

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

ここで、次のようなMyMooseClassのインスタンスを作成したいと思います。

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

$ a_non_moose_stuffは非mooseクラスのインスタンスですが、必要なロールメソッドを実装しています。

Mooseを使用して実装されていない場合でも、$ a_non_moose_stuffがロールに準拠していることをMooseに確認させる方法はありますか?

4

1 に答える 1

5

最も簡単な方法は、ロールの代わりに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::Typesをチェックしてください。

ところで、コンストラクターでハッシュ参照を使用することはサポートされており、Mooseがベストプラクティスと見なされる前の長い間、私が知っているほとんどのMoose作成者はそれをスキップし、コンストラクターパラメーターのリストを提供するだけです。私の意見では、タイピングが少し少なく、見た目もすっきりしています。

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

ハッシュ参照アプローチの主なポイントは、Mooseを使用してPerlオブジェクトを構築しているときに実際には発生しないいくつかのあいまいさを解決するのに役立つことでした。Mooseはすべての定型文と式典を扱っているので、スタイルは異なりますが、私の意見では不要です。私の2セント。

落ち着いて、

ジョン

于 2010-08-31T12:51:22.340 に答える