10

インポート中にMooseが自動的にオンになる仕組みを知っていますstrictか? Moose クラスをwarningsオンにして、その動作を拡張したいと考えていautodieます。use feature ':5.10'

Moose::ExporterMooseimportがこれstrict->importをどこで行っているかを追跡しましたwarnings->import

ただし、このインポート メソッドを Moose 風に拡張する方法がわかりません。

これをどのように処理すればよいですか?

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

4

4 に答える 4

5

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

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

于 2009-11-05T15:53:13.773 に答える
2

Moose::Exporterimport使用している砂糖クラスのカスタムメソッドを定義できます。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
于 2009-11-09T20:54:15.120 に答える
2

モジュールがその関数を -ing 名前空間にエクスポートする方法は多数あるuseため、目的のライブラリをそれぞれ実装するためにコードを掘り下げる必要がある場合があります。あなたが求めているのは Moose に固有のものではないので、あなたやあなたの会社独自のベスト プラクティス モジュールを作成して、作業するための標準のグループを設定することができます。

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() からユーザーのパッケージを見つけることに依存し、goto を使用するため、少し複雑になりますが、より多くのテストを行うことでより良い方法を見つけることができるかもしれません。実装すればするほど、このライブラリは複雑になる可能性がありますが、すべてのコードまたは会社のコード内で使用できる 1 回限りのソリューションを得るには十分な価値があるかもしれません。

于 2009-11-05T16:36:04.603 に答える
1

パッケージに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のインポートメソッドを呼び出すことです。サブクラス化することでそれを行うことができます。おそらく、Mooseを自分で使用することもできます;-)

于 2009-11-05T14:00:20.673 に答える