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

前端之家收集整理的这篇文章主要介绍了perl – 处理Moose中的多继承构造函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问候,

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

在我的其他CGI-App子类中,我喜欢使用一个设置方法父类,该方法查看子类的符号表并自动设置runmodes.我想我可以使用Moose的元类设施以更清洁的方式实现同​​样的目的.所以这是我在父类中的内容

  1. use MooseX::Declare;
  2.  
  3. class MyApp::CGI
  4. extends Moose::Object
  5. extends CGI::Application {
  6.  
  7. method setup {
  8. $self->start_mode( 'main' );
  9.  
  10. my @methods = map { $_->name } $self->Meta->get_all_methods;
  11.  
  12. $self->run_modes( map { /^rm_(.+)$/ => $_ }
  13. grep { /^rm_/ }
  14. @methods
  15. );
  16. }
  17.  
  18. }

……在我的孩子班上:

  1. use MooseX::Declare;
  2.  
  3. class MyApp::CGI::Login
  4. extends MyApp::CGI {
  5. method rm_main {
  6. return "it works";
  7. }
  8. }

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

  1. around new {
  2. $self = $orig->( @_ );
  3. $self->CGI::Application::new( @_ );
  4. }

这给了我

  1. 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一起编译模块.但是,这里似乎有用:

应用程序基类

  1. package My::App;
  2.  
  3. use Moose;
  4. use MooseX::NonMoose;
  5. extends 'CGI::Application';
  6.  
  7. sub setup {
  8. my $self = shift;
  9. $self->start_mode( 'main' );
  10.  
  11. $self->run_modes(
  12. map { $_ = $_->name;
  13. /^rm_ (?<rm>.+) $/x ? ( $+{rm} => $_ ) : ()
  14. } $self->Meta->get_all_methods
  15. );
  16. }
  17.  
  18. "My::App"

派生类

  1. package My::Login;
  2. use Moose;
  3. extends 'My::App';
  4.  
  5. sub rm_main { 'it works!' }
  6.  
  7. "My::Login"

脚本

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. # For testing on the command line
  7. use FindBin qw( $Bin );
  8. use lib $Bin;
  9.  
  10. use My::Login;
  11.  
  12. my $app = My::Login->new;
  13.  
  14. $app->run;

产量

  1. C:\Temp\f> t
  2. Content-Type: text/html; charset=ISO-8859-1
  3.  
  4. it works!

猜你在找的Perl相关文章