如何通过猴子补丁添加包别名
How to add a package alias by monkey-patching
我正在尝试在不修改源代码的情况下解决有问题的包:
Treex::PML::Schema::Container.pm
中的一个长子例程包含两个对不存在的包 Treex::PML::FSFactory
的引用。应该是Treex::PML::Factory
。
- 有问题的子例程太长,无法从另一个文件复制和猴子补丁,所以我想猴子补丁
Treex::PML
以便它提供 Treex::PML::FSFactory
作为 [= 的别名13=]。
在我的主程序中我尝试了以下(基于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::createSeq
和 Treex::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::;
我正在尝试在不修改源代码的情况下解决有问题的包:
Treex::PML::Schema::Container.pm
中的一个长子例程包含两个对不存在的包Treex::PML::FSFactory
的引用。应该是Treex::PML::Factory
。- 有问题的子例程太长,无法从另一个文件复制和猴子补丁,所以我想猴子补丁
Treex::PML
以便它提供Treex::PML::FSFactory
作为 [= 的别名13=]。
在我的主程序中我尝试了以下(基于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::createSeq
和 Treex::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::;