このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、モジュールのフォールバックは実装できた。
では、肝心な変換部分をどのように呼び出すか。
まず考えられるのが、読み込まれたモジュールを調べ、
それにより分岐する方法だ。
use は内部で require を呼び出している。
require で読み込まれたファイルは、
パッケージ変数 %INC に格納されている。
なので、Encode モジュールが読み込まれているかどうかは、
exists $INC{'Encode.pm'} が真を返すかどうかで分かる。
これを使えば、WRITE メソッド内で分岐させることができる。
sub WRITE {
...
if (exists $INC{'Encode.pm'}) {
$length = Encode::from_to( ... );
} else if (exists $INC{'Jcode.pm'}) {
$encoding = Jcode::convert( ... );
} else {
$encoding = jcode::convert( ... );
}
...
}
しかし、これはあまり美しいものではない。
まずは関数が読みにくくなること。
そして、何度も呼ばれる可能性のあるメソッドに、
冗長な分岐命令が入ってしまう。
ではどうすればいいか。
分岐方向は、モジュール読み込み時に決まってるはずだ。
その際に、文字コード変換サブルーチンへの
リファレンスを変数に格納しておけばいいのだ。
そうすれば、WRITE メソッド内で、
コードリファレンスを呼び出すだけで変換できるようになる。
ただし、Encode, Jcode, jcode.pl はそれぞれ、
呼び出し規則が異なる。それを吸収する仕組みが必要だ。