在穆斯多重继承的构造函数处理(Dealing with multiple-inherited con

2019-09-17 04:56发布

问候,

我正在学习驼鹿 ,我想写一个CGI ::应用与驼鹿,这是一个事实,即CGI-应用不是基于穆斯犯了难子类。

在我的其他CGI应用程序内的子类,我想有一个父类setup ,看起来在子类的符号表,并自动设置了runmodes方法。 我想我可以用驼鹿的元类设施,以实现一个更清洁的方式是一样的。 所以这是我在我的父类:

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没有得到正确安装的原因是因为setup是由CGI应用程序内的构造函数调用, Moose::Object是坚持自己的构造在我的课。 我试图用一个方法修改来解决这个:

around new { 
    $self = $orig->( @_ );
    $self->CGI::Application::new( @_ );
}

这给了我

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

我有一种感觉,但是,我在完全错误的方式去了解这一点,驼鹿实现一个更好的设施我想要什么,我至今还未发现。

Answer 1:

你已经看过麋::食谱::基础知识:: DateTime_ExtendingNonMooseParent和MooseX :: NonMoose ?

更新:我不是很熟悉,驼鹿和各种技术。 我是不是能够得到模块使用编译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!


文章来源: Dealing with multiple-inherited constructors in Moose