2013-12-19 1 views
1

두 개의 Perl 클래스가 있습니다. 하나를 Client이라고하고 다른 하나는 Server이라고합시다. Server은 잘 정의 된 무스 클래스입니다. Client은 무스 클래스가 아니며 네트워크를 통해 Server 개체에 연결하기위한 매우 얇은 외관입니다.무스 클래스의 가져 오기 메소드 무시

또한 Client은 프로젝트의 내부 작업이므로 다른 사람이 사용해서는 안됩니다. 현재 우리 회사에서 다른 개발자가 항상 신뢰할 수있는 것은 아닙니다. 그들이 뭔가 잘못하고 있다는 것을 그들에게 통지하기 위해, 우리의 Client 클래스는 사용자 정의 import 문이 있습니다

package Client; 

sub import { 
    my ($self, $promise) = @_; 
    die "this is not a public API" 
     unless $promise eq "Only CertainTeam should be using this API"; 
} 

sub do_something { ... } 

사람이 Client를 사용하는, 그들은 입력해야합니다 그래서 위해 :

use Client q{Only CertainTeam should be using this API}; 

이것이 최선의 접근 방법인지 확실하지 않지만 다른 팀이 Client을 사용하는 것을 막는 데는 효과적입니다. 이제 무스 수업을 Client으로 만들고 싶습니다. 그렇지만, use Moose;을 추가 할 때 perl은 꽤 불행합니다. 이제 Moose의 임포트를 무시하고 있습니다.

Prototype mismatch: sub Client::with: none vs (&;$) at Client.pm line 14 

사람이 무스 클래스하면서 내가 Client의 수입 동작을 지속 할 수있는 방법에 어떤 아이디어가 : 나는 다음과 같은 오류가 발생합니다?

+1

누구나 간단한 '클라이언트 사용'()을 사용하면이 문제를 무시할 수 있습니다. 'Client'를 다른 위치에 설치하는 것만으로는 해결할 수없는 것이 확실합니까? (어리석은 다른 개발자들이 액세스 할 수없는 곳)? – AKHolland

답변

3

이 오류 메시지는 import 방법과 관련이 없습니다. Moose가 클래스에 이러한 메소드를 설치하지 않으므로 Moose가 클래스에 설치 한 import 메소드를 대체하지 않습니다.

Moose가 with이라는 함수를 내 보냈지 만 패키지에 이미 with이라는 함수가 포함되어 있기 때문입니다. 추측 해 보면 예외 처리를 위해 훌륭한 Error.pm을 사용하고 있습니다. 이 함수는 with이라는 함수를 내 보냅니다. 이것은 known incompatibility입니다.

내 제안 :

  • Error.pm은 더 이상 관리자들에 의해 권장합니다. try/catch의 경우 Try::Tiny으로 전환하십시오.
  • Error :: Simple 기본 클래스의 예외는 Error.pm과 동일한 배포의 일부입니다. Throwable::Error으로 전환하는 것이 좋습니다.
  • import 방법은 보안상의 아주 이상한 시도처럼 보입니다. Client 클래스의 이름을 CertainTeam::Internal::Client과 같은 것으로 바꾸는 것은 어떻습니까? 이것이 다른 사람들의 사용을 멈추지는 않을 것이지만, 분명히 또 다른 팀의 내부 클라이언트에 대한 언급으로 자신의 코드를 쓰는 사람은 문제를 야기합니다. 그들이 얻을 수있는 유일한 보장은 코드가 깨지면 두 가지를 모두 유지할 수 있다는 것입니다.
+0

확실히 중첩 된 종속성에 묻혀 있지만, 뭔가 Error.pm을 사용하고 있습니다. 제안 해 주셔서 감사합니다. 그러나 적어도 # 1과 # 2는 내 통제에서 제외되었습니다. # 3의 권력을 설득하려고 노력할 것입니다. 왜냐하면 정말로 * 액세스를 제한하고 두통을 일으키는 기괴한 방법이기 때문입니다. –

+1

음, 다른 곳에서 두 개의 'with'함수를 가져올 수 있습니다. 마지막으로 가져온 것이 "승리"합니다.이 성가신 경고 메시지가 나옵니다. 그러나 경고 메시지를 사용하지 않으려면 경고가 표시되지 않습니다 (프로토 타입 다시 정의). – tobyink

관련 문제