【发布时间】:2013-02-13 02:03:32
【问题描述】:
您好,
我正在学习 Moose 并且我正在尝试使用 Moose 编写一个 CGI::Application 子类,由于 CGI-App 不是基于 Moose 的事实,这使得这变得困难。
在我的其他 CGI-App 子类中,我喜欢有一个带有 setup 方法的父类,它查看子类的符号表并自动设置运行模式。我想我可以使用 Moose 的元类工具以更简洁的方式实现相同的目标。所以这是我在父类中的内容:
use MooseX::Declare;
class MyApp::CGI
extends Moose::Object
extends CGI::Application {
method setup {
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
}
...在我的孩子班里:
use MooseX::Declare;
class MyApp::CGI::Login
extends MyApp::CGI {
method rm_main {
return "it works";
}
}
我意识到我的运行模式没有正确设置的原因是因为setup 被 CGI-App 构造函数调用,而Moose::Object 在我的类中粘贴了它自己的构造函数。我试图用方法修饰符解决这个问题:
around new {
$self = $orig->( @_ );
$self->CGI::Application::new( @_ );
}
这给了我
Can't call method "BUILDARGS" on unblessed reference at ...Moose/Object.pm line 21.
然而,我有一种感觉,我以完全错误的方式处理这件事,而 Moose 有更好的工具来实现我想要的,我还没有发现。
【问题讨论】: