如何通过猴子补丁添加包别名

How to add a package alias by monkey-patching

我正在尝试在不修改源代码的情况下解决有问题的包:

在我的主程序中我尝试了以下(基于this recipe),但它似乎没有任何效果:

use Treex::PML;
package Treex::PML;
use Package::Alias FSFactory => 'Treex::PML::Factory';

package MyPackage;
...

如何让 Treex::PML::FSFactory 到 spring 存在,并且 Treex::PML::Schema::Container 可见?

编辑: 这个特定的错误在我报告错误后的几个小时内就得到了修复!但是无论如何知道如何给包起别名还是很有用的。虽然我通过子类化解决了我的问题,但正如接受的答案所建议的那样,我添加了一个自我回答,展示了如何使用别名来完成。

鉴于相关参考文献,

$content = Treex::PML::FSFactory->createSeq(...)
$content = Treex::PML::FSFactory->createList(...)

添加以下内容应该就足够了:

{
   package Treex::PML::FSFactory;
   our @ISA = qw( Treex::PML::Factory );
}

我检查了 Treex::PML::Factory::createSeqTreex::PML::Factory::createList 是否介意通过子类调用,他们不介意;他们完全无视他们的祈求者。

@ikegami 的建议,派生 class 而不是别名,效果很好。但这里也是如何将一个包名称别名为另一个包名称,正如问题所问:

一个。随着 Package::Alias:

use Package::Alias 'Treex::PML::FSFactory' => 'Treex::PML::Factory';

b。为了避免从 cpan 下载 Package::Alias,我遵循了 this recipe,它显示了 Package::Alias 实际上是如何做到的。它奏效了:-)

*Treex::PML::FSFactory:: = \*Treex::PML::Factory::;