Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用MooseX::Declare关闭内联构造函数_Perl_Oop_Moose_Mop - Fatal编程技术网

Perl 使用MooseX::Declare关闭内联构造函数

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

您好

作为我关于麋鹿的后续研究,我现在遇到了一个新问题。我有一个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( @_ );
    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 );
 }