Cache::Funky && Catalyst
http://tomyhero-perl-module.googlecode.com/svn/trunk/Catalyst-Model-CacheFunky-Loader/
今日は、id:kopugとNewbiethon予定だったのだが、残念ながら保留。
なんで一人で,キャッシュファンキーディレクトリ内のモジュールを、モデルとして読み込むクラスを作ってみた。
$c をどういう風にファンキー側に渡して使えるようにしてあげるかという部分が保留中というか、id:kopugの楽しみに置いといてあげよう。
後は、パッケージ名どうしようか。 Catalyst::Model::FunkyLoader Catalyst::Model::CacheFunkyLoader Catalyst::Model::CFunkyLoader Catalyst::Model::CacheFunky::StorageLoader
package Catalyst::Model::FunkyLoader; use strict; use warnings; use base qw/Catalyst::Model/; use NEXT; use Module::Recursive::Require; sub new { my $self = shift->NEXT::new(@_); my $class = ref( $self ) ; my $funky_class = $self->{funky_class}; my @funkies = Module::Recursive::Require->new()->require_by($funky_class); no strict 'refs'; for my $funky ( @funkies ) { $funky->setup( %{ $self->{funky} } ); my $funky_short = $funky; $funky_short =~ s/^$funky_class\:\://g; my $classname = "${class}::$funky_short"; *{"${classname}::ACCEPT_CONTEXT"} = sub { return $funky ; }; } return $self; } 1;
package Funky::Model::Funky; use base qw/Catalyst::Model::FunkyLoader/; __PACKAGE__->config( funky_class => 'Funky::Cache', funky => { 'Storage::Simple' => {} }, ); 1;
package Funky::Cache::A; use base qw/Cache::Funky/; __PACKAGE__->register( 'foo', sub { `date` } ); 1;
package Funky::Controller::Root; use strict; use warnings; use base 'Catalyst::Controller'; __PACKAGE__->config->{namespace} = ''; sub default : Private { my ( $self, $c ) = @_; # Hello World $c->log->debug( $c->model('Funky::A')->foo() ) ; sleep(1); $c->log->debug( $c->model('Funky::A')->foo() ) ; sleep(1); $c->log->debug( $c->model('Funky::A')->foo() ) ; sleep(1); $c->log->debug( $c->model('Funky::A')->delete(qw/foo/) ) ; sleep(1); $c->log->debug( $c->model('Funky::A')->foo() ) ; sleep(1); $c->log->debug( $c->model('Funky::A')->foo() ) ; sleep(1); $c->response->body( $c->welcome_message ); } sub end : ActionClass('RenderView') {} 1;
.-----------------------------------------------------------------+----------. | Class | Type | +-----------------------------------------------------------------+----------+ | Funky::Controller::Root | instance | | Funky::Model::Funky | instance | | Funky::Model::Funky::A | class | | Funky::Model::Funky::B | class | '-----------------------------------------------------------------+----------'
軽く作ってみる。
package Catalyst::Model::FunkyLoader; ... sub new { my $self = shift->NEXT::new(@_); my $c = shift; # <- 追加 ... *{"${funky}::context"} = sub { $c }; # <- 追加 *{"${classname}::ACCEPT_CONTEXT"} = sub { return $funky ;
package Funky::Cache::A; use base qw/Cache::Funky/; use strict; __PACKAGE__->register( 'foo', sub { __PACKAGE__->context->model('DB::Users')->count() } ); 1;
sub default : Private { my ( $self, $c ) = @_; # Hello World $c->model('DB')->storage->debug(1); $c->log->debug( $c->model('Funky::A')->foo() ) ; $c->log->debug( $c->model('Funky::A')->foo() ) ; $c->log->debug( $c->model('Funky::A')->foo() ) ; $c->log->debug( $c->model('Funky::A')->delete(qw/foo/) ) ; $c->log->debug( $c->model('Funky::A')->foo() ) ; $c->log->debug( $c->model('Funky::A')->foo() ) ; $c->response->body( $c->welcome_message ); }
SELECT COUNT( * ) FROM users me: SELECT COUNT( * ) FROM users me: [info] *** Request 2 (0.250/s) [25600] [Sat Jun 9 18:05:47 2007] *** [debug] "GET" request for "/" from "192.168.30.201" [debug] 2 [debug] 2 [debug] 2 [debug] [debug] 2 [debug] 2 [info] Request took 0.054791s (18.251/s) .----------------------------------------------------------------+-----------. | Action | Time | +----------------------------------------------------------------+-----------+ | /default | 0.041080s | | /end | 0.000288s | '----------------------------------------------------------------+-----------'
うーん。こんなんでいいのかなぁ。どうだろ。
http://tomyhero-perl-module.googlecode.com/svn/trunk/Catalyst-Model-CacheFunky-Loader/