我有两个Perl类。我们叫一个Client
,另一个Server
。 Server
是一个定义明确的Moose类。 Client
不是Moose类,只是通过网络连接到Server
对象的非常薄的外观。
此外,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
作为Moose类时保持导入行为有任何想法?
答案 0 :(得分:3)
此错误消息与您的import
方法无关。你没有覆盖Moose已经安装到你班级的import
方法,因为Moose没有在你的班级中安装任何这样的方法。
这是因为Moose导出了一个名为with
的函数,但是你的包已经包含一个名为with
的函数。猜测一下,你正在使用古老的Error.pm进行异常处理;导出一个名为with
的函数。这是known incompatibility。
我的建议:
import
方法似乎是一种非常奇怪的安全尝试。如何将Client
类重命名为CertainTeam::Internal::Client
?虽然这不会阻止其他人使用它,但是任何通过引用显然是另一个团队的内部客户端来代表他们的代码的人都会招来麻烦。他们获得的唯一保证是,如果他们的代码中断,他们可以保持两半。