2016-10-01 52 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]; 
}