MooseXをインラインコンストラクタをオフにする::宣言
質問
ご挨拶、
のムース、私についての私の前の質問へのフォローアップとして、新しい問題に遭遇し、今」VEの。私はを使用していますムースクラスを持っています非ムース親クラスを拡張するために、レシピ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
を使用しています。このクラスのサブクラスを持っています。私は今、デフォルトの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_constructor => 0
パラメータをオンに取得する方法を見つけ出すことができませんでした。
解決
私はこの1つをクラックすることができました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