MooseX :: NonMoose类中mixins的问题

fri*_*edo 5 perl moose mixins cgiapp mop

考虑以下:

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 'CGI::Application';
extends 'CGI::Application';
Run Code Online (Sandbox Code Playgroud)

关于Moose内部人员我不知道(或任何事情,真的)知道这是不是一个好主意.

Eth*_*her 5

我发现use base 'CGI::Application'; extends 'CGI::Application';它并不是非常可怕,因为它确切地符合你的需要:

  • 在编译时,@ISAcontains 'CGI::Application',它完全满足CGI :: Application :: Plugin ::*的使用要求
  • 在运行时,您的类是CGI :: ApplicationMoose后代,具有所有后续的好处(能够使用Moosey meta goodness设计您的类的组合).只有在遇到线路之后才会完成任何工作(即在您的类上调用方法),这些工作依赖于语句所做的工作:您的类来自并且您已安装了元类.extends 'CGI::Application'extendsMoose::Object

也就是说,jrockway的解决方案也应该有效:

BEGIN { extends 'CGI::Application' }
Run Code Online (Sandbox Code Playgroud)

...你来自哪里,当你需要它,它不应该是让所有的MOOSEY元善良只是一点点提前过于提前,前提是你已经调用use Moose,并use MooseX::NonMoose以定义extends.

(附录:现在我正在考虑创建强制在编译时强制解析关键字的能力的复杂性,这些关键字会立即被解析,例如它们是否被包裹在一个BEGIN块中.例如Moose.pm声明的那样use compiletime qw(extends).肯定会是一个很好的语法糖.)