使用Moose :: Meta :: Class或Class :: MOP :: Class生成正确的动态类

时间:2017-04-18 21:28:16

标签: perl oop code-generation moose

我想实现简单的方法链接,因为该方法必须返回对象。由于我的代码已经使用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!,我看到了

  

找不到对象方法" new"通过包" Tiger"在dynamic.pl   第33行

有什么问题?

1 个答案:

答案 0 :(得分:0)

谁将回应构造函数创建?

另一种方法是直接使用元类变量。

https://gist.github.com/akzhan/421579163dfc86f570809f50d239800f