[英]Problem with mixins in a MooseX::NonMoose class
考虑以下:
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
CGI :: Application :: Plugin :: *类时,它希望我在编译时继承CGI::Application
。 插件类试图在我的类上调用add_callback
作为类方法,但不能,因为我的@ISA
尚未设置。
解决这个问题的最佳方法是什么? 在BEGIN
块中手动调整@ISA
会干扰MooseX::NonMoose
吗?
编辑
以下似乎有效,但我发现它令人反感:
package MyApp::CGI;
use Moose;
use MooseX::NonMoose;
use base 'CGI::Application';
extends 'CGI::Application';
关于Moose内部人员我不知道(或任何事情,真的)知道这是不是一个好主意。
我找不到use base 'CGI::Application'; extends 'CGI::Application';
use base 'CGI::Application'; extends 'CGI::Application';
非常可怕,因为它完全符合你的需要:
@ISA
包含'CGI::Application'
,它完全满足CGI :: Application :: Plugin :: *的使用要求 extends 'CGI::Application'
行之后才会完成任何工作(即在你的类上调用方法),这些工作依赖于extends
语句所做的工作:你的类来自Moose::Object
而你安装了一个元类。 也就是说,jrockway的解决方案也应该有效:
BEGIN { extends 'CGI::Application' }
...在你需要的时候,你可以提前获得所有Moosey meta goodness,并且它不应该超出预定时间,前提是你已经调用了use Moose
并use MooseX::NonMoose
来定义extends
。
(附录:现在我正在思考创建强制在编译时强制解析关键字的能力的复杂性,这些解析是立即解析的,例如它们是否包含在BEGIN
块中。例如,如果Moose.pm声明use compiletime qw(extends)
。肯定会是一段很好的语法糖。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.