问候,
我正在学习Moose并且我正在尝试用Moose编写一个CGI::Application子类,由于CGI-App不是基于Moose而变得困难.
在我的其他CGI-App子类中,我喜欢使用一个设置方法的父类,该方法查看子类的符号表并自动设置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::Cookbook::Basics::DateTime_ExtendingNonMooseParent和
MooseX::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!