4

次のようなメソッド修飾子を提供する役割があります。

package MyApp::Role::MenuExtensionRed;

use Moose::Role;
requires 'BuildMenu';

after 'BuildMenu' => sub {...};

他の場所の要件により、実行時に次のようにいくつかのロールを適用する必要があります。

package MyApp::MainMenu

before 'BuildMenu' => sub {
    my ( $self, $args ) = @_;

    my $roles  = $args->{menu_extensions};
    apply_all_roles($self,@$roles);
};

sub BuildMenu {...}

ただし、'after' メソッド修飾子は呼び出されません。明らかに私はいくつかのルールを破っていますが、なぜこれが機能しないのかを本当に理解したいです!

「BuildMenu」の前にロールを適用する代わりに、BUILD メソッドでロールを適用すると機能します。残念ながら、私の menu_extension ロールのリストはその時点では利用できないため、待つ必要があります。

代替ソリューションをいただければ幸いです。

編集興味深いことに、after 'BuildMenu'IS が呼び出されますが、BuildMenu への後続の呼び出しでのみです。したがって、メソッドの修飾子は、それ自体の別の修飾子内から変更することはできません。これは予想される動作ですか?実行時に修飾子の「リスト」に追加する方法はありますか?

4

1 に答える 1