gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:14:05 25 4
gpt4 key购买 nike

你好,

作为我的 previous question 的后续关于 Moose,我现在遇到了一个新问题。我有一个 Moose 类,它使用 Recipe 12为了扩展非 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_constructor => 0范围。

最佳答案

感谢 IRC 上的一些人,我能够破解这个。声明类 mutable足以关闭 auto_make_immutable标志在 MooseX::Declare ,所以我可以手动完成。 (当然,这也适用于非 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 );
}

关于perl - 使用 MooseX::Declare 关闭内联构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1060470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com