gpt4 book ai didi

perl - 在 Moose 中处理多个继承的构造函数

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

问候,

我在学习Moose我正在尝试写一个CGI::Application Moose 的子类,由于 CGI-App 不是基于 Moose 的事实而变得困难。

在我的其他 CGI-App 子类中,我喜欢有一个带有 setup 的父类查看子类的符号表并自动设置运行模式的方法。我想我可以使用 Moose 的元类工具以更简洁的方式实现相同的目标。所以这是我在父类中的内容:

use MooseX::Declare;

class MyApp::CGI
extends Moose::Object
extends CGI::Application {

method setup {
$self->start_mode( 'main' );

my @methods = map { $_->name } $self->meta->get_all_methods;

$self->run_modes( map { /^rm_(.+)$/ => $_ }
grep { /^rm_/ }
@methods
);
}

}

...在我的 child 类:
use MooseX::Declare;

class MyApp::CGI::Login
extends MyApp::CGI {
method rm_main {
return "it works";
}
}

我意识到我的运行模式没有正确设置的原因是因为 setup由 CGI-App 构造函数调用, Moose::Object在我的类(class)中坚持自己的构造函数。我试图用方法修饰符解决这个问题:
around new { 
$self = $orig->( @_ );
$self->CGI::Application::new( @_ );
}

这给了我
Can't call method "BUILDARGS" on unblessed reference at ...Moose/Object.pm line 21.

然而,我有一种感觉,我正在以完全错误的方式解决这个问题,而 Moose 有更好的设施来实现我想要的,我还没有发现。

最佳答案

您是否已经看过 Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParentMooseX::NonMoose ?

更新:我对 Moose 和各种技术不是很熟悉。我无法使用 MooseX::Declare 编译模块和 MooseX::NonMoose一起。但是,这似乎可行:

应用基类

package My::App;

use Moose;
use MooseX::NonMoose;
extends 'CGI::Application';

sub setup {
my $self = shift;
$self->start_mode( 'main' );

$self->run_modes(
map { $_ = $_->name;
/^rm_ (?<rm>.+) $/x ? ( $+{rm} => $_ ) : ()
} $self->meta->get_all_methods
);
}

"My::App"

派生类
package My::Login;
use Moose;
extends 'My::App';

sub rm_main { 'it works!' }

"My::Login"

脚本
#!/usr/bin/perl

use strict;
use warnings;

# For testing on the command line
use FindBin qw( $Bin );
use lib $Bin;

use My::Login;

my $app = My::Login->new;

$app->run;

输出
C:\Temp\f> t
Content-Type: text/html; charset=ISO-8859-1

it works!

关于perl - 在 Moose 中处理多个继承的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057661/

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