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 $@;
}
Другие вопросы по тегам