如果使用 perl AUTOLOAD 和 Moose::Meta::Class 不存在,如何动态添加属性?

How to dynamically add an attribute if it not exists using perl AUTOLOAD and Moose::Meta::Class?

我正在尝试将值为 testClass1 Resource1 属性添加。 但是它不起作用。我的代码有什么问题?

package Class1;
use Moose;

sub AUTOLOAD {
    my $self = shift;
    our $AUTOLOAD;
    my $unknown_method_name = (split(/::/, $AUTOLOAD))[-1];
    require Class2; # generator class
    Class2->generate_one($self, $unknown_method_name);
}


package Class2;
use Moose;

sub generate_one {
  my ($self, $object, $p) = @_;
  $object->meta->add_attribute(
    $p => {
      is => 'ro',
      default => 'test',
      lazy => 1
    }
  );
}


package main;
my $a = Class1->new;
warn $a->Resource1; # must be 'test' but showing Moose::Meta::Attribute=HASH(0x333ca10)

您生成了属性及其访问器,但忘记调用访问器。所以代码 returns 在第一次调用时没有任何内容。

更正示例:

sub AUTOLOAD {
    my $self = shift;
    our $AUTOLOAD;
    my $unknown_method_name = (split(/::/, $AUTOLOAD))[-1];
    require Class2; # generator class
    Class2->generate_one($self, $unknown_method_name);
    return $self->$unknown_method_name(@_);
}