マスタリングPerl (10章 モジュールの修正と応急処置)

モジュール修正の解決策

  • パッチを作者に送る
    • diffコマンドを使用してパッチを作成する。
$ diff -u original_file updated_file > original_file.diff
    • 作者はpatchコマンドで取り込み。
$ patch < original_file.diff
  • ローカルパッチ
    • モジュールのバージョンを非常に高い値にして、アップデートによる上書きを回避する。
our $VERSION = 99999;
  • モジュールを引き継ぐ
  • フォークする
  • 一からモジュールを作成する

モジュールの一部を変更する

オリジナルのコードは変更しないで、問題点だけを修正する。
BEGIN内でモジュールをロードし、問題のサブルーチンを型グラブで再定義する。

BEGIN {
use Sample::Module;

no warnings 'redefine';

*Sample::Module::new = sub
{
    ... ;
}
}

サブクラス化

変更が必要なモジュールを継承するサブクラスを作成する。

サブルーチンのラップ

Hook::LexWrapモジュールを使用して、サブルーチンをラップする。
Hook::LexWrapモジュールは、関数を書き換えずに関数の前後に処理を挿入したり、関数の返値を変更することができる。

#!/usr/bin/perl

use strict;
use warnings;
use Hook::LexWrap;

wrap 'foo',
    pre => sub { "前処理"; },
    post => sub { "後処理"; };

sub foo {
    ... ;
}

# $_[-1]に値を設定すると処理を横取りしたり、戻り値を書き換えることができる。

Hook-LexWrap-0.26 - Lexically scoped subroutine wrappers - metacpan.org