覆盖Moose类的导入方法

时间:2013-12-19 21:37:20

标签: perl moose

我有两个Perl类。我们叫一个Client,另一个ServerServer是一个定义明确的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类时保持导入行为有任何想法?

1 个答案:

答案 0 :(得分:3)

此错误消息与您的import方法无关。你没有覆盖Moose已经安装到你班级的import方法,因为Moose没有在你的班级中安装任何这样的方法。

这是因为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?虽然这不会阻止其他人使用它,但是任何通过引用显然是另一个团队的内部客户端来代表他们的代码的人都会招来麻烦。他们获得的唯一保证是,如果他们的代码中断,他们可以保持两半。