それぞれがアイテムのセットを定義し、私は複数の役割を持っていると仮定します。Perlクラスの属性の構成ですか?
package A;
use Moose::Role;
sub items() { qw/apple orange/ }
package B;
use Moose::Role;
with 'A';
sub items() { qw/watermelon/ }
package C;
use Moose::Role;
sub items() { qw/banana/ }
は、私は別のクラスでそれらを使用して、私はこれらすべてのアイテムを収集したいとします
package Foo;
use Moose;
with qw(B C);
sub do_something {
my $self = shift;
my @items = ???; # How can I get apple, orange, watermelon, banana here?
....
}
一つの可能な解決策れますMooseX::ComposedBehaviorを採用するが、そのPODは、APIが「あまり安定していない」こと、そして「現在の実装はハックのものであり、より堅牢なものに置き換えなければならない」と(記事の執筆時点では)言う。したがって、私は、このような "ハック"に頼ることなくこれを達成できるかどうかを調べています。それはその間に変更されている可能性があるため
警告:あなたは、将来的にこれを読んでいる場合、MooseX::ComposedBehaviorのPOD(0.003現在のバージョン)を確認するために行ってください。物事はすぐに変わる。 CPANの著者は新しいバージョンをリリースします。現時点で「あまり安定していない」ものは、将来的にはより安定していくかもしれません。他のモジュールがあるかもしれません。自分自身で調べて。
my @items = map $_->items, @ISA;
ただし、これはムーゼでは機能しません。より良い、より信頼性の高いソリューションはありますか?
更新:さまざまな人々は、私は私の以前のアサーションMooseXを削除#moose IRC channelで私を要求したよう:
package A;
use Moose::Role;
sub items() { qw/apple orange/ }
package B;
use Moose::Role;
with 'A';
sub items() { qw/watermelon/ }
package C;
use Moose::Role;
sub items() { qw/banana/ }
package Foo;
use Moose;
with qw(B C);
sub items() {}
sub do_something {
my $self = shift;
my @items = map $_->execute, grep $_,
map $_->get_method('items'),
$self->meta->calculate_all_roles_with_inheritance;
...
}
更新:私はこの3行のソリューションになってしまいました:: ComposedBehaviorは "安定していません"、それをPODから取ったリテラルテキストに置き換えました。
アップデート:私は、次の構文を使用できますMooseX::Collectモジュールを書いた:
package Foo;
use Moose;
use MooseX::Collect;
collect 'items';
with qw(B C);
sub do_something {
my $self = shift;
my @items = $self->items;
...
}
私はあなたがここで役割をしたいとは思わない。 "B"と "C"の役割をFooに組み込むと、 "items"メソッドとの競合が発生し、Fooはコンパイルされないだけでなく、コンパイルする方法も独自の "items " 方法。 –