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

如何扩展驼鹿的自动pragma导出?

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

    你知道驼鹿是如何自动启动的吗? strict warnings 在导入期间?我想通过打开 autodie use feature ':5.10' 在我的驼鹿课上。

    我已经找到了驼鹿在哪做的,在 Moose::Exporter ,它组装了一个自定义 import 召唤的驼鹿 strict->import warnings->import 呼叫类。

    但是,我无法找到一种方法来用驼鹿式的方式扩展这个导入方法。

    我该怎么办?

    http://www.friedo.com/bullwinkle.gif

    4 回复  |  直到 16 年前
        1
  •  2
  •   jsoverson    16 年前

    因为模块可以通过多种方式将其函数导出到 use -在名称空间中,为了实现每个所需的库,可能需要进行一些代码挖掘。您所要求的并不是驼鹿特有的,因此您可以编写您或您公司自己的最佳实践模块,该模块将为您建立一组标准,供您使用,例如。

    use OurCompany::BestPractices::V1;
    

    具有

    package OurCompany::BestPractices::V1;
    
    use strict;
    use warnings;
    use feature (':5.10');
    require Fatal;
    require Moose;
    
    # Required for straight implementation of autodie code
    our @ISA;
    push @ISA, qw(
       Fatal
    );
    
    sub import {
       my $caller = caller;
       strict->import;
       warnings->import;
       feature->import( ':5.10' );
       Moose->import ({into => $caller});
    
       #autodie implementation copied from autodie source
       splice(@_,1,0,Fatal::LEXICAL_TAG);
       goto &Fatal::import;
    }
    
    1;
    

    Autodie使事情变得更复杂一些,因为它依赖于从caller()中找到use-er的包并使用goto,但是您可以通过更多的测试找到更好的方法。实现的越多,这个库可能就越复杂,但它可能具有足够的价值,使您能够在所有代码或公司代码中使用一次性解决方案。

        2
  •  5
  •   daotoad    16 年前

    我的方法向后解决了这个问题。

    为什么不使用 ToolSet 创建一组 use 陈述包括 Moose 以及你的附加语用?

    代码应该类似于:

     # MagicMoose.pm
     package MagicMoose;
    
     use base 'ToolSet'; 
    
     ToolSet->use_pragma( qw/feature :5.10/ ); # perl 5.10
     ToolSet->use_pragma( qw/autodie/ );
    
     # define exports from other modules
     ToolSet->export(
         'Moose'          => undef,       # get the defaults
     );
    
     1; # modules must return true
    

    我还没有测试过这个。坦白说,我刚发现 ToolSet 几天前,还没有机会试一试。fwiw,评论是积极的。

        3
  •  2
  •   perigrin    16 年前

    Moose::Exporter 将允许您定义自定义 import 你正在使用的糖类的方法。 MooseX::POE 多年来一直使用这个版本,但我认为它是一种“黑客”的方式。查看文档 Moose:出口商 以下应该是你想要的

    package Modern::Moose;
    use Moose ();
    use Moose::Exporter;
    
    my ($import) = Moose::Exporter->build_import_methods(
        also => 'Moose',
        install => [qw(unimport init_meta)],
    );
    
    sub import { # borrowing from mortiz's answer for feature/mro
        feature->import( ':5.10' );
        mro::set_mro( scalar caller(), 'c3' );        
        goto &$import;
    }
    

    这样就可以这样使用了

    package MyApp;
    use Modern::Moose;
    
    has greeting => (is => 'ro', default => 'Hello');
    sub run { say $_[0]->greeting } # 5.10 is enabled
    
        4
  •  1
  •   moritz    16 年前

    您必须在包中定义一个名为import的子类,并在其中导入所有其他内容。

    来自modern::perl(您可能会看到的另一个策略模块)的示例:

    use 5.010_000;
    
    use strict;
    use warnings;
    
    use mro     ();
    use feature ();
    
    sub import {
         warnings->import();
         strict->import();
         feature->import( ':5.10' );
         mro::set_mro( scalar caller(), 'c3' );
    }
    

    更新:抱歉,没有仔细阅读问题。

    扩展现有导入方法的一个好方法是在新包中编写自己的方法,并从中调用moose的导入方法。你可以通过子类化来做到这一点,也许你甚至可以自己用驼鹿来实现这一点;-)

    推荐文章