2016-10-01 4 views
1

Ниже приведен упрощенный пример моего реального кода:Moo: Добавить атрибут в другой (внеоборотных) пакет

#!/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"; 

Я пытаюсь добавить атрибут к пакету Y от функции, определенной в пакете X. Это не работает:

$ ./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]; 
}