2011-01-27 1 views
5

Perl과 Moose을 사용하여 플러그인을 통해 확장 할 수있는 앱을 작성하고 싶습니다. 나는 플러그인을 작성하기위한 몇 가지 무스 모듈이 있으며 다른 방법이 있다는 것을 알고있다.무스 응용 프로그램 용 플러그인 시스템을 구축하는 가장 좋은 방법은 무엇입니까?

내 옵션에는 어떤 것이 있습니까? 내가 그들에 대해 무엇을 알아야합니까? 플러그인 시스템을 구현하기 전에 내가 생각해야 할 것은 무엇입니까?

+1

[Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)을 보셨습니까? –

+0

@Len 한 번에 다른 모듈을 훑어 보았지만 지역 사회 경험을 통해 배우고 싶습니다. 나는 적어도 3 가지 다른 것들을 발견하고 다른 방법들에 대해서도 읽었다 고 생각합니다. 왜 그렇게 많은 방법이 존재하는지, 그 차이점은 무엇인지 모르겠습니다. TIMTOWTDI,하지만 일반적으로 한 가지 이상의 방법이 존재해야합니다. – xenoterracide

답변

5

확장 성을 제공하는 몇 가지 방법이 있습니다. 사용자가 클래스에 역할을 적용하거나 흥미있는 것을 수행하는 작은 객체 (델리게이트)를 전달하도록 허용합니다. 대리인은 역할보다 뛰어나지 만 모든 확장 성을 미리 계획해야합니다. 역할을 사용하면 더 많은 ad-hoc 동작이 가능합니다.

대리자 : AnyEvent::Subprocess

역할 : Devel::REPL

플러그인 역할 MooseX::Object::Pluggable 구현되는 여기

각 접근을 두 CPAN 분포이다.

위임자는 원하는대로 구현됩니다.

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; 
} 

그런 다음이 같은를 사용합니다 : 패턴이 어떤 클래스 C에 역할 R, 여기서 A에 다음 클래스 C 위임을하는 클래스 A의 인스턴스를 통과하는 예입니다

my $sorter = Sort->new(comparer => SpaceshipCompare->new); 
my @sorted = $sorter->my_sort("1one", "0", "43"); 

Sort가 변경되는 방식을 원할 경우 Compare 역할을하는 새 클래스를 만든 다음 인스턴스를 Sort의 생성자에 전달하면됩니다. 즉각적인 유연성!

+0

당신은 MooseX :: Object :: Pluggable와 Module :: Pluggable 사이의 차이점을 아는 모든 기회가 있습니까? – xenoterracide

+0

@xenoterracide MooseX :: Object :: Pluggable은 네임 스페이스를 기반으로 현재 클래스에 역할을 적용합니다. Module :: Pluggable은 네임 스페이스/인스턴스 목록을 제공합니다. 그것들은 "look up namespaces"부분을 넘어 거의 완전히 다릅니다. – perigrin

+0

멋진 예제의 경우 +1 – qodeninja

관련 문제