あなたのコードはサブルーチン定義を name に割り当てており、名前空間内で完全修飾関数名を呼び出すか、シジルを使用&Foo::fork
することでいつでも実行できます。Foo::fork()
&fork
Foo
package Foo;
TestModule->new('Foo')->mock(fork => sub { ... });
Foo::fork; # calls mocked function
⋔ # calls mocked function
{ package Bar; &fork } # error: no &Bar::fork
fork; # calls builtin
組み込み関数をオーバーライドして、bare のfork
呼び出しが組み込み関数の代わりに関数を呼び出すようにすることは、"コンパイル時にモジュールから名前をインポートすることによってのみ行うことができます"。それが難しかった場合は、プラグマが次の条件を満たしていることを知ってsubs
おいてください。
package Foo;
use subs 'fork'; # compile-time import of name 'fork'
TestModule->new('Foo')->mock(fork => sub { ... });
Foo::fork; # calls mocked function
⋔ # calls mocked function
fork; # now calls mocked function
{ package Bar; fork; } # calls builtin
CORE::fork; # always calls builtin