はじめに
はじめまして。大沢と申します。
この連載では,
今回は,
本連載で使うサンプルアプリケーション
本連載では,
GopperはCodeRepos上のsvnリポジトリに置いてあるので各自checkoutしてください。
svn co -r 271 http://svn.coderepos.org/share/lang/perl/Gopper/trunk Gopper
サンプルアプリケーションは連載中にも頻繁にupdateされる事が予想されますので,
なお,
Gopper
Gopperとは,
サーバの各フェーズにフックポイントがあり,
現在はシンプルな機能しか持ち合わせていませんが,
Class::Componentとは
Class::Componentとは,
Class::Accessor::Fastなどのアクセサモジュールのプラガブル版だと思っていただければ間違いありません。
例えばMyClassというモジュールでプラグイン機能を使いたくなった場合には,
package MyClass;
use strict;
use warnings;
use Class::Component;
1;
とClass::Componentをuseして下さい。Class::Componentをロードする時に別途パラメータを付加する必要が無ければuse baseでも問題ありませんが,
特長
Class::Componentの特長としては以下のような特徴があります。
- Component追加で基本メソッドを拡張出来る
- Plugin追加で,
フックポイントへのフック処理追加や, Pluginメソッドを追加出来る - Pluginで追加するメソッドの実装方式(普通にメソッド生やす,
AUTOLOAD, SingletonMethod)を選べ, 選ばなければメソッド生えない - Plaggerのようなconfigを利用するPluginを簡単に実装できる
- モジュール独自にAttribute処理を追加出来る
- Class::Componentを利用したモジュールを,
さらに別モジュールが継承する事が出来る - Class::Componentを使ったオブジェクトをYAML::DumpしてYAMLに変換した後でも,
そのYAMLをYAML::Loadすれば普通に動くので, オブジェクトの永続化を取り易い
他にも特長がありますが,
主要コンポーネント
Class::Componentは,
Component
作成したモジュールの基本的な動作をカスタマイズするコンポーネントになっています。
大まかな挙動としては,
作成するモジュールにとって,
MyClassモジュールに対する名前空間はMyClass::Component::*になります。
Attribute
Pluginで利用するAttributeを定義するコンポーネントとなっています。
MyClassモジュールに対する名前空間はMyClass::Attribute::*となっており,
package MyClass::Plugin::Foo;
use strict;
use warnings;
use base 'Class::Component::Plugin';
sub plugin_method: Simple {
my($plugin, $context, $args) = @_;
...
}
1;
といった形で利用する事が出来ます。
Plugin
いわゆるプラグインで,
Componentと違い,
先ほど説明したAttributeをメソッドに対して利用する事により,