no indirect; / no indirect ':fatal';
間接オブジェクト構文で警告を出したり致命的エラーを出したりするプラグマ。おなじみのPL_checkハックで実装されている。
以下のようなありがちな実行時エラーをコンパイルエラーに変えることができる。
use Test::More tests => 2; use Foo; no indirect ':fatal'; isa_ok Foo->new(),"Foo";# NG: Foo->isa_ok()->new() ok Foo->bar(); # NG: Foo->ok()->bar()
実装方法がautoboxのそれとは少し違うのが気になる。PL_check[...]をモジュールのロード時に完全に置き換えてしまうので,indirectのスコープ外でのオーバーヘッドが大きくなる。一方,ヒントハッシュのキーのハッシュ値をあらかじめ計算することで,スコープ内でのオーバーヘッドはむしろautoboxよりも小さそうだ。もっとも,いずれにせよコンパイル時のオーバーヘッドなので実行速度とは関係ないのだが。