内容

名称

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 来确定需要哪些存根。