Devel::SelfStubber - 为 SelfLoading 模块生成存根
仅生成存根
use Devel::SelfStubber;
Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
或生成整个模块,并将存根正确插入
use Devel::SelfStubber;
$Devel::SelfStubber::JUST_STUBS=0;
Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
MODULENAME 是 Perl 模块名称,例如 Devel::SelfStubber,而不是 'Devel/SelfStubber' 或 'Devel/SelfStubber.pm'。
MY_LIB_DIR 默认为 '.',如果不存在。
Devel::SelfStubber 打印您需要在 __DATA__ 标记之前放入模块中的存根(或者您可以让它打印整个模块,并将存根正确放置)。存根确保如果调用方法,它将被加载。它们专门用于继承的自动加载方法。
以下示例可以更好地解释这一点
假设有四个类:A、B、C 和 D。
A 是根类,B 是 A 的子类,C 是 B 的子类,D 是 A 的另一个子类。
A
/ \
B D
/
C
如果 D 调用在类 A 中定义的自动加载方法 'foo',则该方法将加载到类 A 中,然后执行。如果 C 然后调用方法 'foo',并且该方法在类 B 中重新实现,但设置为自动加载,则查找机制永远不会到达 B 中的 AUTOLOAD 机制,因为它首先找到已经在 A 中加载的方法,因此错误地使用了它。如果方法 foo 在 B 中被存根,则查找机制将找到存根,并正确加载和使用来自 B 的子程序。
因此,为了使类和子类能够与自动加载一起正确地进行继承,您需要确保加载了存根。
SelfLoader 可以在模块初始化时使用语句 'SelfLoader->load_stubs()'; 自动加载存根,但您可能希望避免与初始化相关的存根加载开销(尽管请注意 SelfLoader::load_stubs 方法迟早会被调用 - 最迟在第一个子程序被自动加载时)。在这种情况下,您可以在 __DATA__ 标记之前放置子程序存根。这可以手动完成,但此模块允许自动生成存根。
默认情况下,它只打印存根,但您可以将全局变量 $Devel::SelfStubber::JUST_STUBS 设置为 0,它将打印出整个模块,并将存根放置在正确的位置。
至少,这对于查看 SelfLoader 认为哪些是存根很有用 - 为了确保 SelfStubber 的未来版本与 SelfLoader 保持一致,SelfStubber 实际上使用 SelfLoader 来确定需要哪些存根。