Perl 5.10以降には、プラグインモジュールの仕組みを簡単に実現する事ができるModule::Pluggableが標準モジュールとして導入されています。
このモジュールを使うと所謂プラグインモジュールを読み込むための仕組みが簡単に実装する事が出来ます。
以下、使い方。こんな構成でサンプルプログラムを用意しました。
$ tree
.
|-- bin
| `-- Main.pl
`-- lib
|-- SomeModule
| `-- Plugin
| `-- Plugin1.pm
`-- SomeModule.pm
各ファイルの役割は以下の通りです。
- Main.pl
単にSomeModuleクラスを呼び出しているだけのメインスクリプト。
- Plugin1.pm
プラグインの実体です。
- SomeModule.pm
プラグインを呼び出すモジュールです。
Main.plは単にSome::Moduleを呼び出す。
$ more Main.pl
#!/usr/bin/env perl
use strict;
use warnings;
use lib '../lib';
use SomeModule;
my $app = SomeModule->new();
$app->plug_method();
SomeModule.pmは、プラグインを利用するモジュールです。Module::Pluggableを使う事で、pluginメソッドが使える様になり、インストールされてるプラグインを自動的に検索し、メソッドを呼び出します。
なお、検索対象のディレクトリは任意に設定する事も出来ます。標準では「モジュール名::Plugin::」配下を検索します。
$ more SomeModule.pm
package SomeModule;
use strict;
use warnings;
use Module::Pluggable require => 1;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub plug_method {
my $self = shift;
foreach my $plugin (__PACKAGE__->plugins) {
$plugin->your_method();
}
return;
}
1;
プラグインの本体です。
$ more Plugin1.pm
package SomeModule::Plugin::Plugin1;
use strict;
use warnings;
sub your_method {
print "ya!";
}
1;
本格的に使おうとすると、プラグインの管理(インストール、アンインストール、有効にする、無効にするとか)や、メソッド名の衝突とか、色々と作り込まないといけない事が多いと思いますが、プラグイン数が少ないうちは全部読み込んでしまえば良いので、素のままで使っても大丈夫そうですね。

コメントする