繁体   English   中英

处理Moose中的多继承构造函数

[英]Dealing with multiple-inherited constructors in Moose

问候,

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

在我的其他CGI-App子类中,我喜欢使用一个setup方法的父类,该方法查看子类的符号表并自动设置runmodes。 我想我可以使用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
                        );
    }

}

......在我的孩子班上:

use MooseX::Declare;

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

我意识到我的runmodes没有正确设置的原因是因为CGI-App构造函数调用了setup ,而Moose::Object在我的类中坚持自己的构造函数。 我尝试用方法修饰符解决这个问题:

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::DeclareMooseX::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!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM