2009-11-27 5 views
1

내가 알아낼 수없는 이상한 것이있다. 오래된 표준 Exporter 모듈을 사용하여 몇 가지 상수를 내보내려는 무스 클래스가 있습니다. 그러나, 곧 내가 내 수업에 extends Exporter를 추가, 어떤 이유로, 기본 무스 생성자는 더 이상 상속하지 않으며 나는 치명적인 오류 얻을됩니다 : 여기 무스 : Extending Exporter가 생성자를 사라지게합니까?

Can't locate object method "new" via package "MyApp::Dispatch" 

이 문제를 보여줍니다 간단한 테스트입니다. extends 라인을 제거

package Foo; 
use Moose; 
use constant NARF => 'poit'; 
extends 'Exporter'; 

1; 

$ perl -I./lib -MFoo -e '$f=Foo->new' 
Can't locate object method "new" via package "Foo" at -e line 1. 

문제가 사라질 수 있습니다.

이것은 무스 0.93을 사용하고 있습니다.

답변

4

다른 무스 기반 클래스에서 상속한다고 가정하기 때문에 Moose :: Object에서 상속받지 않습니다. 표준 응답이 무엇인지 모르겠습니다. Moose :: Object를 수동으로 추가하거나 MooseX :: NonMoose 또는 다른 것을 사용하는 것입니다.

그러나 Exporter는 상속되지 않은 경우에도 정상적으로 작동합니다.

use Exporter "import"; 
+2

글쎄, 분명 했어야했는데, 그렇지 않아야 했나요? 나는 오늘 밤 바보 같아. :) MooseX :: NonMoose를 사용하기까지 했으므로 그렇게 생각해야했지만 그렇지 않았습니다. 어쨌든, 상속보다'import '를 가져 오는 것이 좋습니다. – friedo

+0

무스의'extends'는'@ISA = @ list'와 같습니다. 이리스트가 컴파일 타임에 비어 있다면 Moose는 자동으로'Moose :: Object'를 @ISA에 넣을 것입니다. – perigrin

+0

@perigrin : 기본적으로 말한 것이 었습니다. – ysth

2

당신은 이미 진짜 대답을 가지고,하지만 당신은 물건을 수출하고 객체가있는 모듈이 왜 실제 질문은 다음과 같습니다 단지의 수입 루틴을 가져? 꽤 이상한 디자인이고 코드 냄새 일 수 있습니다.

+1

내보내기는 시스템의 다른 부분에서 등록한 콜백에 사용되는 상수입니다. 나는 그것이 조금 이상하다라고 동의한다. 그리고 아마 디자인을 조만간 재고 할 것이다. 하지만 지금은 효과가 있습니다. – friedo