必要なことを行うためのより良いパターンは何ですか。問題を最小限に抑えようとしています。順を追って説明します。
次のようなインターフェイスの役割があります。
{
package Likeable;
use Moose::Role;
requires 'likers';
requires 'do_like';
}
この後、前のインターフェースを半実装する (この場合はすべてを実装する) 2 つの抽象ロールが必要です。
{
package Likeable::OnSelf;
use Moose::Role;
with 'Likeable';
has 'likers' => ( is => 'rw', isa => 'ArrayRef' );
sub do_like { }
}
{
package Likeable::OnParent;
use Moose::Role;
with 'Likeable';
requires 'parent';
sub likers { shift->parent->likers(@_) }
sub do_like { shift->parent->do_like(@_) }
}
後でこのコードをコンパイルする必要があります
{
package OBJ::OnSelf;
use Moose;
with 'Likeable::OnSelf';
}
{
package OBJ::OnParent;
use Moose;
with 'Likeable::OnParent';
has 'parent' => ( is => 'rw', isa => 'Obj' );
}
foreach my $obj (OBJ::OnSelf->new, OBJ::OnParent->new(parent => OBJ::OnSelf->new)) {
if ( $obj->does('Likeable') ) {
$obj->do_like
}
}
問題は、Moose::Role で派生を行おうとしているように思えますが、問題を正しく解決する方法がわかりません。
あなたの提案をいただけますか?