如果使用 perl AUTOLOAD 和 Moose::Meta::Class 不存在,如何动态添加属性?
How to dynamically add an attribute if it not exists using perl AUTOLOAD and Moose::Meta::Class?
我正在尝试将值为 test
的 Class1
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(@_);
}
我正在尝试将值为 test
的 Class1
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(@_);
}