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.
Пожалуйста, помогите, как я могу добавить атрибут в пакет из метода, определенного в другом пакете.
Должен ли я перейти на лося?
1 ответ
Решение
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 $@;
}