2009-12-02 3 views
3

독립 실행 형 유틸리티 클래스 대신 부모 Moose 클래스 내에서 일부 도우미 메서드를 설정하는 방법을 찾고 있습니다. 가능하다면 모듈에 무스탕을 더 투명하게 추가 할 수 있습니다. 도우미 모듈을 명시 적으로 요구하지 않아도됩니다 (모든 것이 extends 선언을 통해 이루어짐).무스 오브젝트에서 Moose :: Exporter를 사용할 수있는 방법이 있습니까?

package Parent; 

use Moose; 

Moose::Exporter->setup_import_methods(
    with_meta => [ 'has_rw' ], 
    as_is  => [ 'thing' ], 
    also  => 'Moose', 
); 

sub has_rw { 
    my ($meta, $name, %options) = @_; 
    $meta->add_attribute(
     $name, 
     is => 'rw', 
     %options, 
    ); 
} 

# then later ... 
package Child; 

use Moose; 
extends 'Parent'; 

has 'name'; 
has_rw 'size'; 
thing; 

을하지만이 작동하지 않습니다 :

perl -I. -MChild -wle'$obj = Child->new(size => 1); print $obj->size' 
 
String found where operator expected at Child.pm line 10, near "has_rw 'size'" 
     (Do you need to predeclare has_rw?) 
syntax error at Child.pm line 10, near "has_rw 'size'" 
Bareword "thing" not allowed while "strict subs" in use at Child.pm line 12. 
Compilation failed in require. 
BEGIN failed--compilation aborted. 

PS

example provided in the documentation을 바탕으로, 이것은 내가 가고있는 무슨 약이다. 나는 또한 수출 마법을 역할 (extends Parent;이 아닌 with Role;이 아닌)로 옮기려고했지만 동일한 오류가 발생합니다.

답변

7

이것은 지원되지 않으며 이유가 있습니다. 계급이나 역할은 설탕 방법과 같지 않으며 어떤 수준에서는 다른 것들이 달라야합니다. 문제는 다음 무스 + 사용자 정의 설탕 패키지를 "사용"할 필요가되면 당신은 단순히 당신의 예를 훔치는뿐만 아니라 사용자 정의 설탕 패키지 수출 무스를함으로써 그것을 해결할 수 :

package MySugar; 
use strict; 
use Moose::Exporter; 

Moose::Exporter->setup_import_methods(
    with_meta => [ 'has_rw' ], 
    as_is  => [ 'thing' ], 
    also  => 'Moose', 
); 

sub has_rw { 
    my ($meta, $name, %options) = @_; 
    $meta->add_attribute(
     $name, 
     is => 'rw', 
     %options, 
    ); 
} 

그런 다음 당신은 단순히 말 :

package MyApp; 
use MySugar; # imports everything from Moose + has_rw and thing  
extends(Parent); 

has_rw 'name'; 
has 'size'; 
thing; 

이것은 다른 패키지와 마찬가지로 MooseX::POE이 작동하는 방식입니다. 나는 클래스가 설탕 기능의 묶음이 아니기 때문에 여기에 제안하는 것처럼 extends이 설탕을 가져 오는 것에 반대하여 논쟁 할 것입니다. 두 개는 결코 혼동해서는 안됩니다.

업데이트 : 가장 빠른 방법은 Parent를 Moose :: Object에 적용되는 역할로 다시 만드는 것입니다. 지금 당신은 단순히 당신의 최종 세부 사항을 믿고 어느

package MyApp; 
use MySugar; 

has_rw 'name'; 
has 'size'; 
thing; 

package main; 
MyApp->new->something_special; # prints sparkles 

말할 수

그런 다음 우리는 단순히

Moose::Exporter->setup_import_methods(
    apply_base_class_roles => 'Parent::Methods', 
    with_meta    => ['has_rw'], 
    as_is     => ['thing'], 
    also     => 'Moose', 
); 

처럼 보이도록 MySugar에 수출을 :: 사슴에 대한 호출을 변경 싶었어.

+0

내가 찾고 있었던 것은'Parent'와'MySugar'를 하나의 클래스로 결합하는 것입니다. 그 이유는 설탕이'부모 '에 정의 된 구성 요소를 기반으로 만들어 졌기 때문입니다. 그러나 그것들을 정의하고 따로 따로 가져가는 것은 세상 끝이 아닙니다. 나는 그것들을 분리 된 두 개의 컴포넌트로 분리하고 싶지 않습니다. 그들은 함께 데려 가야합니다. – Ether

+0

넵, Moose :: Exporter를 사용하면 함께 가져올 수 있습니다. 그것들을 하나의 클래스에서 정의하는 것은 내 의견으로는 좋지 않은 생각이다. 왜냐하면 두 개의 다른 것들을 실제로 분리해야하기 때문이다. – perigrin

+0

답변을 업데이트하여 권장 스타일을 사용하여 두 가지를 모두 도입하는 예를 포함 시켰습니다. 이보다 더 많은 것을 원한다면 irc.perl.org에 지난 #moose를지나 Moose 메일 링리스트에 특정 질문을하는 것이 좋습니다. – perigrin

관련 문제