2009-11-05 8 views
10

インポート中にMooseが自動的にstrictwarningsをオンにする方法を知っていますか?私はムーズクラスでautodieuse feature ':5.10'をオンにしてその動作を拡張したいと思います。Mooseのプラグマ自動エクスポートをどのように拡張できますか?

ムースはMoose::Exporterで、これを行うところ、私は、呼び出し元のクラスのstrict->importwarnings->importを呼び出すムースのカスタムimportサブを組み立てた、突き止めました。

しかし、私はこのインポートメソッドをMoose-ishの方法で拡張する方法を理解できません。

どうすればよいですか?あなたのパッケージにインポートと呼ばれるサブを定義し、そこに他のすべてのものをインポートする必要が

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

答えて

2

モジュールがその機能を-ing名前空間にエクスポートする方法はたくさんあるので、それぞれの目的のライブラリを実装するには、コードを掘る必要があります。何を求めているのかは、Moose特有のものではありません。そうすれば、自分やあなたの会社のベストプラクティスモジュールを書くことができます。それは、発信者からの利用-ERのパッケージを見つけることに依存している()と後藤を使用しているため

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と

use OurCompany::BestPractices::V1; 

は、物事はもう少し複雑になりますが、あなたはより良いを見つけることができるかもしれませんより多くのテストで実装が多くなればなるほど、このライブラリはより複雑になるかもしれませんが、あなたやあなたの会社のコード内で使用できる一回限りのソリューションを十分に得る価値があるかもしれません。

+0

素晴らしい例、ありがとう – friedo

+0

私はこのアイデアのバリエーションを使用して終了しました。 – friedo

1

。現代から

例:: 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のインポートメソッドを呼び出すことです。あなたはサブクラス化することでそれを行うことができます。おそらく自分自身でそれを使用することもできます;-)

5

私のアプローチは問題を逆向きに解決します。

ToolSetを使用して、Mooseを含むuseステートメントのグループを追加のプラグマと一緒に作成してみませんか?私はこれをテストしていません

# 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、レビューは肯定的です。

+0

おかげのように使用することができます。私はToolSetについて聞いていなかった。私は今それを調べている。 – friedo

2

Moose::Exporterは、使用している砂糖の種類に合わせてimportメソッドを定義できます。 MooseX::POEは、これを何年も使っていましたが、私は「ハッキリ」と考えています。Moose::Exporter次のドキュメントを見てみると、あなたが

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 
+0

ありがとう!私はこれを今日後で撮影し、私がそれを理解できるかどうかを見ます。 – friedo

関連する問題