2016-10-01 57 views
1

以下是我的實際代碼的簡化示例:武:添加屬性到另一個(非流動)封裝

#!/usr/bin/perl 

package X; 
use Moo; 

sub add_attr_for_another_package { 
    my ($package) = @_; 
    eval "package $package"; 
    has 'q' => (is=>'rw', default=>123); 
} 

package Y; 
use Moo; 

X::add_attr_for_another_package('Y'); 

my $obj = Y->new; 
print $obj->q, "\n"; 

我嘗試添加屬性來包裝從包X定義的函數Y。這是行不通的:

$ ./test.pl 
Can't locate object method "q" via package "Y" at ./test.pl line 18. 

請幫助我如何從另一個包中定義的方法添加屬性到包。

我應該改用穆斯嗎?

回答

3

package影響編譯代碼的包。它顯然不會影響已編譯的代碼(例如,調用has)!換句話說,has的調用必須在package指令生效時纔會被編譯。

sub add_attr_for_another_package { 
    my ($package) = @_; 
    eval(" 
    package $package; 
    has 'q' => (is=>'rw', default=>123); 
    return 1; 
    ") 
    or die [email protected]; 
} 
相關問題