标签: cgiapp

处理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
                        );
    }

}
Run Code Online (Sandbox Code Playgroud)

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

use MooseX::Declare;

class MyApp::CGI::Login 
extends MyApp::CGI { 
    method rm_main { 
        return "it works";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

around new { 
    $self = $orig->( @_ );
    $self->CGI::Application::new( …
Run Code Online (Sandbox Code Playgroud)

oop perl moose cgiapp mop

6
推荐指数
1
解决办法
1132
查看次数

MooseX :: NonMoose类中mixins的问题

考虑以下:

package MyApp::CGI;

use Moose;
use MooseX::NonMoose;
use Data::Dumper;

extends 'CGI::Application';

BEGIN { 
    print "begin isa = " . Dumper \@MyApp::CGI::ISA;
};

print "runtime isa = " . Dumper \@MyApp::CGI::ISA;

... 
Run Code Online (Sandbox Code Playgroud)

编译时的输出是:

begin isa = $VAR1 = [
          'Moose::Object'
        ];
runtime isa = $VAR1 = [
          'CGI::Application',
          'Moose::Object'
        ];
Run Code Online (Sandbox Code Playgroud)

我为什么在意?因为当我尝试useCGI :: Application :: Plugin ::*类时,它希望我CGI::Application已经在编译时继承.插件类试图add_callback在我的类上调用类方法,但不能,因为我@ISA还没有设置.

解决这个问题的最佳方法是什么?@ISABEGIN块中手动调整是否会干扰MooseX::NonMoose

编辑

以下似乎有效,但我发现它令人反感:

package MyApp::CGI;

use Moose;
use MooseX::NonMoose;

use base …
Run Code Online (Sandbox Code Playgroud)

perl moose mixins cgiapp mop

5
推荐指数
1
解决办法
362
查看次数

标签 统计

cgiapp ×2

moose ×2

mop ×2

perl ×2

mixins ×1

oop ×1