2009-11-05 7 views
10

가져 오는 동안 Moose가 자동으로 strictwarnings을 켜는 방법을 알고 계십니까? 내 무스 수업에서 autodieuse feature ':5.10'을 사용하여 해당 동작을 확장하고 싶습니다. 무스는이 작업을 수행 곳Moose의 자동 pragma 내보내기를 어떻게 확장 할 수 있습니까?

가 나는 호출 클래스 strict->importwarnings->import를 호출 무스에 대한 사용자 지정 import 하위 조립 Moose::Exporter에, 아래로 추적했습니다.

그러나이 가져 오기 방법을 무스 - 쉐 방식으로 확장하는 방법을 알 수 없습니다.

어떻게 처리해야합니까?

http://www.friedo.com/bullwinkle.gif

답변

2

모듈이 해당 함수를 use -ing 네임 스페이스로 내보낼 수있는 많은 방법이 있으므로 원하는 각 라이브러리를 구현하려면 코드 파기가 필요할 수 있습니다. 당신이 요구하는 것은 무스에만 국한된 것이 아니므로 귀하 또는 귀하의 회사 자체 베스트 프랙티스 모듈을 작성하여 함께 작업 할 수있는 표준 그룹을 구성 할 수 있습니다. 이 호출에서 사용 - 어의 패키지를 찾을 수에 의존()와 고토를 사용하기 때문에

package OurCompany::BestPractices::V1; 

use strict; 
use warnings; 
use feature (':5.10'); 
require Fatal; 
require Moose; 

# Required for straight implementation of autodie code 
our @ISA; 
push @ISA, qw(
    Fatal 
); 

sub import { 
    my $caller = caller; 
    strict->import; 
    warnings->import; 
    feature->import(':5.10'); 
    Moose->import ({into => $caller}); 

    #autodie implementation copied from autodie source 
    splice(@_,1,0,Fatal::LEXICAL_TAG); 
    goto &Fatal::import; 
} 

1; 

Autodie와

use OurCompany::BestPractices::V1; 

상황이 조금 더 복잡하게,하지만 당신은 더 나은를 찾을 수 있습니다 더 많은 테스트가 필요합니다. 더 많이 구현할수록이 라이브러리는 더 복잡해 질 수 있지만 모든 회사 코드 또는 회사 코드에서 사용할 수있는 일회용 솔루션을 갖추려면 충분히 높은 가치가있을 수 있습니다.

+0

좋은 예, 고마워요 – friedo

+0

나는이 아이디어의 변형을 사용하여 결국. – friedo

1

당신은 패키지 수입라는 하위를 정의하고, 거기에 다른 모든 물건을 가져올 수 있습니다.

현대 :: 펄 (다른 정책 모듈을 사용하면 볼 수 있음)에서 예

:

use 5.010_000; 

use strict; 
use warnings; 

use mro (); 
use feature(); 

sub import { 
    warnings->import(); 
    strict->import(); 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3'); 
} 

업데이트 : 죄송합니다, 신중하게 충분한 질문을 읽지 않았다.

기존 가져 오기 방법을 확장하는 좋은 방법은 새 패키지에서 직접 작성하고 거기에서 Moose의 가져 오기 방법을 호출하는 것입니다. 서브 클래 싱을 통해 그렇게 할 수 있습니다. 아마도 무언가를 사용할 수도 있습니다 ;-)

5

내 접근 방식은 문제를 거꾸로 해결합니다.

ToolSet을 사용하여 Moose을 포함하는 use 문의 그룹을 추가 pragma와 함께 사용하지 않는 이유는 무엇입니까? 나는이 테스트를하지 않은

# MagicMoose.pm 
package MagicMoose; 

use base 'ToolSet'; 

ToolSet->use_pragma(qw/feature :5.10/); # perl 5.10 
ToolSet->use_pragma(qw/autodie/); 

# define exports from other modules 
ToolSet->export(
    'Moose'   => undef,  # get the defaults 
); 

1; # modules must return true 

:

코드처럼 보일 것이다. 솔직히, 나는 방금 전에 ToolSet을 발견했고, 그것을 아직 시험해 볼 기회가 없었다. FWIW는 리뷰가 긍정적입니다.

+0

감사처럼 사용할 수 있습니다. 나는 ToolSet에 대해 들어 보지 못했다. 지금 조사 중이 야. – friedo

2

Moose::Exporter을 사용하면 사용중인 설탕 등급에 대해 import 맞춤법을 정의 할 수 있습니다. MooseX::POE은 수년 동안이 버전을 사용했지만, "hackish"방식으로 생각합니다.당신이

package Modern::Moose; 
use Moose(); 
use Moose::Exporter; 

my ($import) = Moose::Exporter->build_import_methods(
    also => 'Moose', 
    install => [qw(unimport init_meta)], 
); 

sub import { # borrowing from mortiz's answer for feature/mro 
    feature->import(':5.10'); 
    mro::set_mro(scalar caller(), 'c3');   
    goto &$import; 
} 

이 요구하는지 다음과 대략해야 Moose::Exporter에 대한 문서를 보면 다음 제안을 너무

package MyApp; 
use Modern::Moose; 

has greeting => (is => 'ro', default => 'Hello'); 
sub run { say $_[0]->greeting } # 5.10 is enabled 
+0

감사합니다. 오늘 나중에이 사진을 찍어서 내가 그걸 이해할 수 있는지 알아 보겠습니다. – friedo

관련 문제