「Sledge::Sessionに便利なアクセサ追加するには」を受けて、Sledge::Sessionにアクセサを追加できるプラグインを作ってみました。下記からダウンロードできます。
Sledge-Plugin-SessionAccessor-0.01.tar.gz
使い方はpodを見てください。…というのもあれなので簡単に説明するとProject::Pages::Baseに下記のようにメソッドと無名関数を定義しておくと、それをベースクラスとしたPagesクラスであれば、$self->session->methodという感じで呼べるようになります。
#と作っておいてあれだけど、ニーズあるのかなぁ…。ありそうだったらコミットしてみよう。
Sledge-Plugin-SessionAccessor-0.01.tar.gz
使い方はpodを見てください。…というのもあれなので簡単に説明するとProject::Pages::Baseに下記のようにメソッドと無名関数を定義しておくと、それをベースクラスとしたPagesクラスであれば、$self->session->methodという感じで呼べるようになります。
#と作っておいてあれだけど、ニーズあるのかなぁ…。ありそうだったらコミットしてみよう。
package Project::Pages::Base;
use Sledge::Plugin::SessionAccessor;
__PACKAGE__->mk_session_accessor(
method => sub {
my $self = shift;
#...
return $foo
},
);
package Project::Pages::Root;
use base qw(Project::Pages::Base);
sub dispatch_index {
my $self = shift;
my $foo = $self->session->method;
}
Sledge::Sessionにメソッドを追加すると複数アプリケーションを動かしている場合に問題があるでは?
これって1つのmod_perl上でってことですよね。
確かに問題あるかもと思って、2つのアプリを動かして、片方で定義したSledge::Session::foo()をもう片方から呼んでみたら呼べなかったです。
でも名前空間は確かに一緒のはずなので問題ありそうな気がしますね。。。もうちょっと調べてみます。
というかそもそも長いシンタクスの割には、
sub Sledge::Session::foo { }
とやってることは同じなのでメリットがあんまりないような。
プロジェクトごとにSledge::Sessionのサブクラスを掘ってそこに定義する形にしたほうがよいかも。
ぅ…。まぁ確かにそれが確実なんですよね。
「パッケージ名::Session」を動的に作ってごにょごにょやるかって感じかなぁ。モジュール化してみるかな。
#パッケージ名::Sessionを手で書いちゃうのが一番簡単でわかりやすそうですけど…(笑)
これ、プラグイン的にimportの中でSledge::Sessionのサブクラスを動的に作ってってやろうと思ったけど、そのプロジェクトで作っているセッションのクラス(Sledge::Session::MySQLとか)を得るにはcreate_sessionを実行してみなければならず、それをやった時点でsessionが1つ作られてしまうからそれはイケてないし、かといって__PACKAGE__->mk_session_accessor()でセッションのクラスを渡すのもナンセンスだと思うし…ということで袋小路に入ってしまいました。。。