2011-01-27 3 views
5

PerlとMooseを使って、プラグインを使って拡張できるアプリを書いてみたい。私は、プラグインを書くためのいくつかのMooseモジュールがあることを知っています、そして、私は他の方法があることを知っています。Mooseアプリケーション用のプラグインシステムを構築するための最良のオプションは何ですか?

私のオプションは何ですか?私はそれらについて何を知るべきですか?私はプラグインシステムを実装する前に考えなければならないことは何ですか?

+1

[Module :: Pluggable](http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)を見ましたか? –

+0

@Len私は一度に異なるモジュールを見ていましたが、私はむしろコミュニティの経験から学ぶでしょう。私は少なくとも3つの異なるものを見つけ出し、他の方法についても読んだと思う。私はなぜそんなに多くの方法が存在するのか、その違いは何か分かりません。 TIMTOWTDIですが、通常は複数の方法が存在する理由があります。 – xenoterracide

答えて

5

拡張性を提供する方法はいくつかあります。ユーザーがクラスにロールを適用したり、興味のあるものを実行する小さなオブジェクト(代理人)を渡すことができます。デリゲートはロールよりも優れたパフォーマンスを示しますが、すべての拡張性を前もって計画する必要があります。ロールにより、より臨時の振る舞いが可能になります。ここ

各アプローチをとる2つのCPAN分布である:

参加者:AnyEvent::Subprocess

役割:Devel::REPL

プラグインの役割をMooseX::Object::Pluggableで実装されています。

あなたが好きだが、参加者は実装されている。

package Compare; 
use Moose::Role; 
requires 'compare'; 


package SpaceshipCompare; 
use Moose; 
with 'Compare'; 

sub compare { my ($a, $b) = @_; return $a <=> $b } 

package Sort; 
use Moose; 

has 'comparer' => (
    is  => 'ro', 
    does  => 'Compare', 
    handles => 'Compare', 
    required => 1, 
); 

sub my_sort { 
    my ($self, @list) = @_; 
    return sort { $self->compare($a, $b) } @list; 
} 

次に、あなたがこのようなを使用します:

my $sorter = Sort->new(comparer => SpaceshipCompare->new); 
my @sorted = $sorter->my_sort("1one", "0", "43"); 
パターンがここでの例ですA.へのクラスCに何らかの役割Rを行い、クラスAのインスタンスを渡し、その後、クラスC委譲されます

Sortの変更方法を変更したい場合は、Compareロールを持つ新しいクラスを作成してから、インスタンスをSortのコンストラクタに渡します。インスタント柔軟性!

+0

あなたはMooseX :: Object :: PluggableとModule :: Pluggableの違いを知っていますか? – xenoterracide

+0

@xenoterracide MooseX :: Object :: Pluggableは、名前空間に基づいて現在のクラスにロールを適用します。 Module :: Pluggableは、名前空間/インスタンスのリストを提供します。それらは、「名前空間を参照する」部分を除いて、ほぼ完全に異なっています。 – perigrin

+0

+1の素晴らしい例 – qodeninja

関連する問題