2011-01-12 49 views
1

我不知道我是否以正確的方式提出這個問題,但我會盡力解釋。如何更新繼承駝鹿類的元信息?

我有一個基類MyClass.pm:

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 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會產生一個,兩個和三個丟失的輸出。

如何獲取包含繼承類的所有方法的方法列表?

回答

4

想要$self->meta->get_all_methods而不是__PACKAGE__->meta->get_all_methods__PACKAGE__在編譯時被Perl綁定,因此它總是MyClass

+0

謝謝! Ouhh,如此明顯:) – 2011-01-12 16:31:03