2011-01-12 9 views
1

私はその質問に正しい方法を尋ねてもわかりませんが、私は説明しようとします。継承されたmooseクラスのメタ情報を更新するには?

use MooseX::Declare; 

class MyClass { 
    method test_it { 
     for (__PACKAGE__->meta->get_all_methods){ 
      print $_->name . "\n"; 
     } 
    } 
} 

そして、別のクラスのMyOtherClass.pm:

use MooseX::Declare; 

class MyOtherClass extends MyClass { 
    method one { 
     return 1; 
    } 

    method two { 
     return 1; 
    } 

    method three { 
     return 1; 
    } 
} 

とスクリプトuse_it.pl:

#!/usr/bin/perl 

use strict; 
use warnings; 

use MyClass; 
use MyOtherClass; 

my $class = MyOtherClass->new; 
my $otherclass = MyOtherClass->new; 

print "MyClass can:\n"; 
$class->test_it; 

print "MyOtherClass can:\n"; 
$otherclass->test_it; 

exit 0; 

出力がある

は、私は、基本クラスのMyClass.pmを持っています:

 
MyClass can: 
dump 
DEMOLISHALL 
meta 
does 
new 
DESTROY 
BUILDALL 
BUILDARGS 
test_it 
DOES 
MyOtherClass can: 
dump 
DEMOLISHALL 
meta 
does 
new 
DESTROY 
BUILDALL 
BUILDARGS 
test_it 
DOES 

MyClassでtest_itを呼び出すと、出力にはメソッドのいくつかのビルドと並んで期待どおりの "test_it"が含まれています。 MyOtherClassでtest_itを呼び出すと、1つ、2つ、3つの欠落がある同じ出力が生成されます。

どのようにして、継承クラスのすべてのメソッドを含むメソッドのリストを取得できますか?

答えて

4

$self->meta->get_all_methodsを入力してください。__PACKAGE__->meta->get_all_methodsではありません。 __PACKAGE__はコンパイル時にPerlでバインドされるため、常にMyClassになります。

+0

ありがとうございます!ああ、あまりにも明白:) –

+3

<3 perl。実際にムースを発明した人があなたの質問に答えてくれました。 \ o/ –

+2

それについては事実上ありません。彼と "最初のコミット"。 – perigrin

関連する問題