tokuhirom's blog.

'; DROP DATABASE database();

Sledge::Adaptor をつくってみた

CatCon1 いってきて、Sledge にも Adaptor がほしくなったので つくってみた。

TheSchwartz とのつなぎこみはこんな感じ。Catalyst::Model::Adaptor を基本にインターフェースを DSL っぽくしてみた。

いままで Sledge::Plugin::MogileFS とか Sledge::Plugin::CacheMemcached とか Sledge::Plugin::TheSchwartz とか、config の情報をえるためだけとショートカットのために Sledge の Plugin 書いたりしてたんですけど、Adaptor で POPO なのもいいなーとおもい始めて、ためしにつくってみた次第。

Adaptor の実装はこんな感じ。prepare_arguments と mangle_arguments をわけてる意味がわかんなかったので、prepare_arguments だけにしてあります。あれ、二つにわけることになんの意味あるのでしょうか?教えて!えらいひと!

package YourProj::Adaptor::TheSchwartz;
use strict;
use warnings;
use Sledge::Adaptor;

class "TheSchwartz";

prepare_arguments {
    my ($app, $args) = @_;
    %$args;
};

1;

あとは、Sledge の方につなぎこんでつかうだけ。

Sledge の config.yaml の中に

production:
  "Adaptor::TheSchwartz":
    databases:
      dsn: ...
      user: hoge
      pass: fuga

とかかいて、Pagesで下記のようにする。

package Your::Pages;
use Sledge::Plugin::Adaptor;

sub dispatch_index {
    my $self = shift;
    $self->adaptor('TheSchwartz')->insert($job);
    $self->adaptor('TheSchwartz')->list_jobs({funcname => 'MyApp::Worker'});
}

1;

Catalyst::Model::Adaptor の Factory とかわかんねーとおもってたら、ヒデキさんに「Adaptor => App起動時, Factory => model呼ぶたび, Factory::PerRequest => 1リクエストごと」とおしえてもらいました!あざっす。