代码之家  ›  专栏  ›  技术社区  ›  friedo

moosex::nonmoose类中的mixin问题

  •  5
  • friedo  · 技术社区  · 16 年前

    考虑以下事项:

    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 阻止干扰 MooseX::NonMoose ?

    编辑

    以下内容似乎有效,但我觉得这很冒犯:

    package MyApp::CGI;
    
    use Moose;
    use MooseX::NonMoose;
    
    use base 'CGI::Application';
    extends 'CGI::Application';
    

    我对驼鹿的内部构造知之甚少(或者说根本不知道),不知道这是不是个好主意。

    1 回复  |  直到 16 年前
        1
  •  5
  •   Ether    16 年前

    我找不到 use base 'CGI::Application'; extends 'CGI::Application'; 非常可怕,因为它正好满足你的需要:

    • 在编译时, @ISA 包含 'CGI::Application' 完全满足cgi::application::plugin::的使用要求*
    • 在运行时,您的类是 Moose 后裔 CGI::Application 以及随之而来的所有好处(能够用moosey meta good设计你的班级的组成部分)。只有在 extends 'CGI::Application' 行中遇到依赖于 extends 声明:您的类从 Moose::Object 你已经安装了一个元类。

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

    BEGIN { extends 'CGI::Application' }
    

    …从你需要的时候开始,你可以提前一点得到所有的moosey meta good,而这不应该是 提前,前提是你已经打过电话 use Moose use MooseX::NonMoose 为了定义 延伸 .

    (附录:现在我在思考创建一种能力的复杂性,这种能力可以在编译时强制解析一个关键字,然后立即对其进行分析,就像它们被包装在 BEGIN 块。例如,如果moose.pm宣布 use compiletime qw(extends) . 当然,这将是一个很好的句法糖分。)

    推荐文章