【问题标题】:Right dynamic class generation using Moose::Meta::Class or Class::MOP::Class使用 Moose::Meta::Class 或 Class::MOP::Class 生成正确的动态类
【发布时间】: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


    【解决方案1】:

    谁来响应构造函数的创建?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2012-03-22
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多