【发布时间】:2017-09-14 21:39:59
【问题描述】:
我想实现简单的方法链接,因为方法必须返回对象。由于我的代码已经在使用 Moose 并且我未来的类几乎是空的并且只返回一个属性和另一个类的实例,我决定使用 Moose::Meta::Class(即Class::MOP::Class 的子类)以编程方式生成它们。第一次使用 Moose 元类,所以我写了一个简单的代码来尝试:
package Cat;
use Moose;
package Generator;
use Moose;
sub generate {
Class::MOP::Class->create(
'Siberian' => (
methods => {
echo => sub { print 'yeah!' }
}
)
);
Class::MOP::Class->create(
'Tiger' => (
attributes => [
Class::MOP::Attribute->new('Siberian' => (
default => sub { require Siberian; Siberian->new; }
)),
],
)
);
Cat->meta->add_attribute(Class::MOP::Attribute->new(
Tiger => (
default => sub { require Tiger; Tiger->new }
)
));
print "Generation done!\n";
}
generate();
package main;
use Generator;
my $a = Cat->new;
warn $a->Tiger->Siberian->echo; # must print 'yeah!' but prints Can't locate object method "new" via package "Tiger" at dynamic.pl line 33
我看到的输出不是预期的yeah!
在 dynamic.pl 中无法通过包“Tiger”定位对象方法“new” 第 33 行
怎么了?
【问题讨论】:
标签: perl oop code-generation moose