题
问候,
作为我的后续 上一个问题 关于驼鹿,我现在遇到了一个新问题。我有一个使用的驼鹿课 食谱12 为了扩展非运动父母类。这里是:
package MyApp::CGI;
### TODO: make this work with MooseX::Declare?
use Moose;
extends 'CGI::Application';
sub new {
my $class = shift;
my $obj = $class->SUPER::new( @_ );
return $class->meta->new_object( __INSTANCE__ => $obj, @_ );
}
sub setup {
my $self = shift;
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
这很棒。我也有这个类的子类 MooseX::Declare
. 。但是,由于我现在正在覆盖默认的驼鹿构造函数,所以我的子类发出了此警告:
Not inlining 'new' for MyApp::CGI::Login since it is not inheriting the default Moose::Object::new
If you are certain you don't need to inline your constructor, specify inline_constructor => 0 in your call to MyApp::CGI::Login->meta->make_immutable
自从 MooseX::Declare
呼叫 make_immutable
自动在幕后,我无法弄清楚如何打开它 inline_constructor => 0
范围。
解决方案
多亏了IRC上的一些人,我才能够破解这个人。宣布班级 mutable
足以关闭 auto_make_immutable
旗帜 MooseX::Declare
, ,所以我可以手动进行。 (当然,这也适用于非MX ::声明类。)
经过修改的版本:
use MooseX::Declare;
class MyApp::CGI extends CGI::Application is mutable {
around new {
my $obj = $self->SUPER::new( @_ );
return $self->meta->new_object( __INSTANCE__ => $obj, @_ );
}
method setup {
$self->start_mode( 'main' );
my @methods = map { $_->name } $self->meta->get_all_methods;
$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}
__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
}
不隶属于 StackOverflow