Devel::SelfStubber - 為 SelfLoading 模組產生 stub
僅產生 stub
use Devel::SelfStubber;
Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
或產生已正確插入 stub 的完整模組
use Devel::SelfStubber;
$Devel::SelfStubber::JUST_STUBS=0;
Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
模組名稱為 Perl 模組名稱,例如 Devel::SelfStubber,而非「Devel/SelfStubber」或「Devel/SelfStubber.pm」。
MY_LIB_DIR 若不存在,預設為「.」
Devel::SelfStubber 會列印您需要在 __DATA__ 符號之前放入模組的 stub(或您可以讓它列印已正確置入 stub 的完整模組)。這些 stub 可確保在呼叫方法時,會載入該方法。它們特別適用於繼承的自動載入方法。
以下範例最能說明這一點
假設有四個類別 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 中建立 stub,則查詢機制會找到 stub,並正確載入和使用 B 中的子程式。
因此,為了讓類別和子類別能正確使用自動載入的繼承,您需要確保已載入 stub。
SelfLoader 可在模組初始化時使用陳述式 'SelfLoader->load_stubs()' 自動載入 stub,但您可能希望避免初始化時有 stub 載入的額外負擔 (但請注意,SelfLoader::load_stubs 方法遲早會被呼叫 - 最晚在第一個子常式自動載入時)。在此情況下,您可以在 __DATA__ 符號之前放置子常式 stub。這可以手動完成,但此模組允許自動產生 stub。
預設情況下,它只會列印 stub,但您可以將全域變數 $Devel::SelfStubber::JUST_STUBS 設為 0,它會列印出整個模組,其中 stub 的位置正確。
至少,這有助於查看 SelfLoader 認為的 stub - 為了確保 SelfStubber 的未來版本與 SelfLoader 保持一致,SelfStubber 實際上使用 SelfLoader 來確定需要哪些 stub。