2011-02-11 5 views
12

私は、サブクラス化されることを意図したMooseクラスを持っており、すべてのサブクラスは "execute"メソッドを実装する必要があります。しかし、クラスのexecuteメソッドにメソッド修飾子を適用して、すべてのサブクラスのexecuteメソッドに適用するようにしたいと思います。しかし、メソッド修飾子は、メソッドがオーバーライドされても保持されません。私のクラスのすべてのサブクラスが自分のメソッド修飾子をそのexecuteメソッドに適用するようにする方法はありますか?Perl/Mooseでは、どのようにしてすべてのサブクラスのメソッドに修飾子を適用できますか?

例:そのサブクラスで、その後

before execute => sub { 
    print "Before modifier is executing.\n" 
} 

:スーパークラスでは、私はこれを持って

sub execute { 
    print "Execute method is running.\n" 
} 

executeメソッドが呼び出されると、それはについては何も言いません。 "before"修飾子。

答えて

9

これは、augmentメソッド修飾子のためのものです。あなた、あなたのスーパークラスでこれを置くことができます。

sub execute { 
    print "This runs before the subclass code"; 
    inner(); 
    print "This runs after the subclass code"; 
} 

そして、代わりにあなたのサブクラスが直接executeを上書きすることができ、あなたがaugmentそれをそれらを持っている:

augment 'execute' => sub { 
    print "This is the subclass method"; 
}; 

基本的に、それはあなただけのaroundようなものだ機能を提供します親/子関係が変更されている場合を除き、修飾子。

+2

Hmm。私のスーパークラスは実際には、サブクラスがexecuteメソッドを宣言することを期待する別の非ムースクラスを継承していることを忘れています。したがって、augment/innerは機能しません。しかし、私はこれが一般的な解決策であることに同意します。私の特定の問題については、*メソッドが*サブクラスで再定義されたりオーバーライドされたりすることがないので、単に呼び出す*メソッドに自分のモディファイアを置くことができることが分かりました。だから、私はこれを受け入れられると思います。 –

+0

@ Ryan Thompson、私はこれを試していない、私はあなたの親と子供の間にほとんど空のMooseクラスを置くことができると思う。その後、 'hobbs'のexecuteメソッドをあなたのMooseアダプタクラスに入れ、他のすべてを継承してください。 **警告:テストされていない、試行されていない、かわいそうな人の話題が慎重に使用されています。** – daotoad

+1

@Ryanですが、スーパークラス*は実行メソッドを宣言しています*それはクラスのサブクラスですそのサブクラスはexecuteメソッドを宣言するため、すべてがaugment/innerを使っています。ツリーのどこにメソッドが実際に追加されているかは関係ありません。 – hobbs

関連する問題