考虑以下几点:

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;

... 

输出当这个汇编是:

begin isa = $VAR1 = [
          'Moose::Object'
        ];
runtime isa = $VAR1 = [
          'CGI::Application',
          'Moose::Object'
        ];

为什么我会在乎?因为当我尝试 use a CGI::Application::插件::*级,它希望我可以继承 CGI::Application 在编译时间。插件类试图呼叫 add_callback 作为一个类方法上我的课,但是不可能的,因为我的 @ISA 设置不起来呢。

什么是最好的方式来解决这个吗?将调整 @ISA 手动中的一个 BEGIN 块干扰 MooseX::NonMoose?

编辑

以下出现的工作,但我找到它进攻:

package MyApp::CGI;

use Moose;
use MooseX::NonMoose;

use base 'CGI::Application';
extends 'CGI::Application';

我不知道够不够(或者任何东西,真正的)关于驼鹿的内部知道如果这是一个很好的想法。

有帮助吗?

解决方案

我找不到 use base 'CGI::Application'; extends 'CGI::Application'; 是非常可怕,因为这不正是你需要:

  • 在编译时间, @ISA 包含 'CGI::Application', ,这完全满足使用要求的CGI::Application::插件::*
  • 在运行时,你是一流的 驼鹿 后裔 CGI::应用程序, 与所有带来的益处(能够设计的组成类Moosey元的善良).它的唯一后 extends 'CGI::Application' 行中遇到的任何工作完成(i。电子方法在您的类)的依赖所做的工作 extends 声明:这类下降,从 Moose::Object 和你有一个元类安装。

这就是说,jrockway的解决方案还应的工作:

BEGIN { extends 'CGI::Application' }

...你从哪里得到所有Moosey元的善良只是有点超前的安排从当你需要它,而且它不应该 计划提前提供你已经被称为 use Mooseuse MooseX::NonMoose 为了定义 extends.

(增编:现在我琢磨complilational复杂问题的创造能力的分析的一个关键字,在编制时是分析立即如果他们在一个包裹 BEGIN 块。例如喜欢的东西如果驼鹿。下午宣布 use compiletime qw(extends).这将是一个不错的一块的语法糖肯定。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top