2013-12-19 39 views
1

我有兩個Perl類。我們打電話給一個Client,另一個ServerServer是一個明確的穆斯類。 Client不是Moose類,只是一個非常薄的外觀,通過網絡連接到Server對象。覆蓋Moose類的導入方法

此外,Client是我們項目的內部,不應該被其他人使用。現在在我們公司,其他開發者不可能總是被信任。爲了幫助通知他們,他們正在做的事情錯了,我們Client類有一個自定義的導入語句:

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()'來繞過這個。你確定這是不能通過在另一個位置安裝'Client'來解決的(在那些討厭的其他開發者無法訪問的地方)? – AKHolland

回答

3

此錯誤消息與您的import方法無關。你不是覆蓋了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'功能。您導入的最後一個「勝出」。你會得到這個惱人的警告信息,但是你可以做一個'no warnings qw(重新定義原型)'來禁用它。 – tobyink