Plugin


自作のフレームワークプラグインを入れようと思いモジュール名を定義してさぁ組むかと思ったところでふと思う。
どういう風に実装しよう。*1

前回、と言うか過去に作ったライブラリ集は基本的に場当たり的に作った物をまとめたと言う形だった。
今回はもっとまとまりのあるフレームワークとしてのライブラリを作ろうと思い、作成している。

しかしながら、そのようなライブラリは得てして大規模になりがちである。
ならば確実に使用する機能*2のみ実装し、その他はプラグインという形での実装が良いのではと思い実装を始めた。

だが、いざ実装となるとこれがちょっと迷う。
たとえばCPANにこのモジュールを仮に登録したとしよう。*3
当然モジュールのインストールされる場所は処理系によって異なる。
故に、ディレクトリを走査してモジュール名を検索、requireしてアクセサ作成という形は難しい。

ならばPluginモジュールにディレクトリの指定をさせればよいのではないかという案が浮かぶ。
たとえばこんな形になるだろう。

use NPK;

my $npk = NPK->new();
$npk->Plugin->init('./Plugin');  # ExcelCong.pmがこのディレクトリには有る
$npk->Plugin->ExcelConv->Conv('csv','./test.csv');
print $npk->Plugin->ExcelConv->OutputHead();
print $npk->Plugin->ExcelConv->OutputData();

しかしそうなると今度はCPANに登録するとなると…という問題が浮かび上がる。

では、どうすればいいのだろうかとあれこれ思ったが結局この方法が一番良いのではないだろうかという結論に陥った。
要するに使用するPluginを列挙すればいいのだ。

use NPK;

my $npk = NPK->new();
$npk->Plugin->init(('ExcelConv','PhraseBook','PgSQL'));
(以下略)

もちろんこれはプロジェクト単位のpackageでオーバーロードしちまうのが常套手段だろう。
たとえばFooプロジェクト用のPackage、Foo.pmを作成しておきそこに共通設定は書いてしまうのである。

もちろん、それだけで全ては解決するわけではないが*4大部分の共通項に関してはそれで済む。

そんなことを考えてへこへこ組むのでした。

*1:このように行き当たりばったりだと大抵破綻します。

*2:ex.文字コード周り、フォームチェック、デバッギング、etc.

*3:あり得ない話しではあるが…

*4:ex.Formの要素確認などは全てのページで共通ではないため。