An implementation of Devel::GlobalDestruction in pure Perl

Devel::GlobalDestruction はPurePerlでも実装できる。

END{
    $in_global_destruction = 1;
}
sub DESTROY{
    return if $in_global_destruction;
    # do something complex
}

Perlソースコードも読んだが,これで完全にDevel::GlobalDestruction::in_global_destruction() の代替になる。

ちなみに,Perl終了時にデストラクタ起動したくなければ,以下のようにするとDESTROYの呼び出しそのものをスキップできる*1

END{
    *DESTORY = sub {};
}

*1:5.10.1以降のperlでは,最適化により空のデストラクタの呼び出しがスキップされるため。