Perl 使用MooseX::Declare关闭内联构造函数
您好 作为我关于麋鹿的后续研究,我现在遇到了一个新问题。我有一个Moose类,它用来扩展非Moose父类。这是:Perl 使用MooseX::Declare关闭内联构造函数,perl,oop,moose,mop,Perl,Oop,Moose,Mop,您好 作为我关于麋鹿的后续研究,我现在遇到了一个新问题。我有一个Moose类,它用来扩展非Moose父类。这是: 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( @_ ); ret
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
。但是,由于我现在覆盖默认的Moose构造函数,我的子类发出以下警告:
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_构造函数=>0
参数 多亏了IRC上的一些人,我才破解了这个。声明类mutable
足以关闭MooseX::Declare
中的auto_make_immutable
标志,这样我就可以手动执行了。(当然,这也适用于非MX::Declare类。)
修订版:
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 );
}