BPT #4: プラグインの相性

blosxomのプラグイン同士には相性というものがあります。これはblosxomの仕様上の制限に基づくものですが、プラグイン側で対応することは可能です。なんですが、blosxomユーザーの多くは(僕を含め)ライトなユーザーが多く、あまり自分の環境以外での挙動を詰めるということはやりません(やれよ)。ので、しばしばプラグインがバッティングしてしまうと言うことは良くあります。

プラグイン同士の相性の最大の原因は、ひとつのblosxomで排他的にしか利用できないプラグイン・サブルーチンがいくつかあるという仕様によるものがほとんどです。排他的にしか利用できないプラグイン・サブルーチンは、

以上の5つで、プラグイン内でこれらのサブルーチンを利用し、かつそのサブルーチンでundef以外を返すと、blosxomはその他のプラグインのそのサブルーチンを二度と呼ばないので、プラグインは複数利用できないということです。

例えば、templateサブルーチンは、

foreach my $plugin ( @plugins ) {
  $plugins{$plugin} > 0
    and $plugin->can('template')
    and defined($tmp = $plugin->template())
    and $template = $tmp
    and last;
}

というように呼び出されます。上記のコードの断片の4行目でプラグインのtemplateサブルーチンが返す値を受け取り、チェックする仕組みになっており、undef以外が返ってきた場合はデフォルトのテンプレートを上書きし、ループを抜けるということになっているわけです。つまり最初に呼び出されたプラグインのtemplateサブルーチン以外は呼び出されることは無いわけで、排他的な利用ということになるわけです。

多くの場合は、排他的な利用しか出来ないプラグイン・サブルーチンを使うプラグインを複数利用することは無い(そういったプラグイン・サブルーチンはある目的に特化したものとして提供されているので)のですが、稀にそういうケースはあります。ので、プラグイン作者の方は気をつけましょうとかそういう話。「お前が気をつけろ」とか言わない。

pagingblosxom starter kitに導入されていない理由はこれだったりします。pagingをきちんと書き直せば良い(ソートしたエントリのリストをプラグイン内で保存してやれば良い)話なので、さっさとやれば良い話。

BPTとか激しく企画倒れ済みなネタを久々に続けてみた!