2011-01-10 3 views
3

디버깅 시간이 너무 많아서 마침내 this issue을 간단한 테스트 케이스로 제거했습니다. 나는 그것이 실패하고있는 이유를 이해하는 데 도움이되도록 겸허하게 요청할 것입니다. :) 여기에 내가지고있어 오류 메시지입니다 :MooseX :: Types 선언 문제, 엄격한 테스트 케이스 :)

plxc16479> $h2/tmp/tmp18.pl 
This method [new] requires a single argument. at /nfs/pdx/disks/nehalem.pde.077/perl/5.12.2/lib64/site_perl/MooseX/Types/TypeDecorator.pm line 91 

MooseX::Types::TypeDecorator::new('MooseX::Types::TypeDecorator=HASH(0x655b90)') called at /nfs/pdx/disks/nehalem.pde.077/projects/lib/Program-Plist-Pl/lib/Program/Plist/Pl.pm line 10 

Program::Plist::Pl::BUILD('Program::Plist::Pl=HASH(0x63d478)', 'HASH(0x63d220)') called at generated method (unknown origin) line 29 

Program::Plist::Pl::new('Program::Plist::Pl') called at /nfs/pdx/disks/nehalem.pde.077/tmp/tmp18.pl line 10 

래퍼 테스트 스크립트 :

use strict; 
use warnings; 

BEGIN {push(@INC, split(':', $ENV{PERL_TEST_LIBS}))}; 

use Program::Plist::Pl; 

my $obj = Program::Plist::Pl->new(); 

프로그램 :: PLIST : 경기 수 파일 :

package Program::Plist::Pl; 

use Moose; 
use namespace::autoclean; 

use Program::Types qw(Pattern); # <-- Removing this fixes error 
use Program::Plist::Pl::Pattern; 

sub BUILD { 
    my $pattern_obj = Program::Plist::Pl::Pattern->new(); 
} 

__PACKAGE__->meta->make_immutable; 

1; 

프로그램 :: 유형 파일 :

package Program::Types; 

use MooseX::Types -declare => [qw(Pattern)]; 

class_type Pattern, {class => 'Program::Plist::Pl::Pattern'}; 

1; 

그리고 프로그램 :: Plist :: Pl :: Patte RN 파일 :

package Program::Plist::Pl::Pattern; 

use Moose; 
use namespace::autoclean; 

__PACKAGE__->meta->make_immutable; 

1; 

참고 : 나는 위의 코드에 Program::Types에서 Pattern 유형을 필요로하지 않지만, 내가 밖으로 제거되어 다른 코드에서 할. INC 경로를 가져 오는 PERL_TEST_LIBS env var에는 프로젝트 모듈에 대한 경로 만 포함됩니다. 이 경로에서로드 된 다른 모듈은 없습니다.

Pattern에 대한 MooseX::Types 정의가 문제를 일으키는 것처럼 보입니다. 그러나 이유는 확실하지 않습니다. 문서는 내가 사용하고있는 구문을 보여 주지만, 그것에 대해 많이 언급하지 않았기 때문에 나는 class_type을 오용하고있을 가능성이 있습니다. 의도는 MooseX::Params::Validate을 통해 Pattern을 사용하여 유형을 확인하여 인수가 Program::Plist::Pl::Program 객체인지 확인할 수 있습니다.

내가 찾은이 직접 Program::TypesPattern 유형을 가져올 경우에도, 아니 오류에 tmp18.pl 래퍼 결과에서 Pattern->new를 호출하여 식에 개입 클래스 Program::Plist::Pl을 제거.

+0

Program :: Plist :: Pl :: Pattern-> new가 Pattern-> new로 오인 된 것 같습니다. 여기서 Pattern은 My MooseX 정의 유형입니다.따라서 Program :: Plist :: Pl :: Pattern의 인스턴스를 만드는 대신 Pattern 유형 객체의 인스턴스를 만들려고합니다. –

답변

5

당신이

package Program::Plist::Pl; 
... 
use Program::Types qw(Pattern); 

당신이 패키지 Program::Plist::PlPattern라는 이름의 서브 루틴을 가져 말할 때. 정규화 된 이름은 Program::Plist::Pl::Pattern입니다. 따라서,

Program::Plist::Pl::Pattern->new(); 

Program::Plist::Pl::Pattern()->new(); 

대신 당신이 무엇을 의미입니다

'Program::Plist::Pl::Pattern'->new(); 

로서 구문 분석합니다. 원한다면 명시 적으로 인용 부호를 써서 작성할 수도 있지만 (그것은 효과가있을 것이다), 성가신 특별한 경우이다. 또 다른 해결책은 패키지 이름과 충돌하지 않는 형식으로 이름을 바꾸는 것입니다 (예 : PatternObj).

namespace::autoclean이 도움이되지 않습니다. 그것은 사람들이 수입 된 잠수함을 메쏘드로 부르지 못하게합니다. 그러나 Program::Plist::Pl::Pattern()을 직접 호출 한 다음 반환 값에 대한 메서드를 호출합니다.

+0

이것은 부수적으로 Perl의 "커뮤니티 표준"명명 규칙 인 TitleCase 클래스 이름 인 lowercase_sub_names_with_underscores를 따르는 훌륭한 이유입니다. TitleCase를 클래스 이름과 하위 이름으로 모두 사용하면 클래스 이름의 맨 오른쪽 구성 요소 (예 : $ product-> Vendor())의 이름을 따서 명명 한 객체 속성의 빈도로 인해 극단적 인 충돌이 발생할 가능성이 높습니다/Set Product :: Vendor 객체). –

+0

cjm - 그래, 내가 버그가 궁지에 몰린 지금은 분명해 보인다. 나는 마침내 무슨 일이 일어나고 있는지를 결정하게되어 기쁘다. 이것은 나를 위해 견과를 몰았다. 그러나 나는 또한 그 시간에 더 많은 것을 배웠다. 나는 꽤 오래 배웠다. :) John - 당신은 명명 표준에 대해 절대적으로 맞습니다. 나는 모든 코드에 따라 그것을 따른다. 그러나 이전에 Moose를 사용 해본 적이 없으며 필자가 본 모든 문서는 UpperCase 형식의 형식 정의 규칙을 사용하므로 명백한 명명 프로토콜을 사용했습니다. –

관련 문제