CatalystのModel中で$cを使いたくなった
$c はModel内では基本的には利用できない。( $c->forward() で呼んだ場合は別 )
コントローラ内でModelを呼ぶときはこんな感じ。
$c->model('Hoge')->orz();
で、ちょっと強引に$cを使える似非モデルプラグインを作ってみた。
準備:
package MyApp; use Catalyst qw/ DependenceModel / __PACKAGE__->config->{depen_model}{package_name} = 'MyApp::DepenModel';
package MyApp::DepenModel; use strict; use warnings; use base qw/Class::Accessor::Fast/; __PACKAGE__->mk_accessors(qw/c/); # * c というアクセサ必須 1;
package MyApp::DepenModel::Hoge; use strict; use base qw/MyApp::DepenModel/; sub orz { my $s = shift; $s->c->log->debug("Hello!"); } 1; # * ここに実際に利用したいロジックを実装していく。 # コントローラ内では $c->depen_model('Hoge')->orz(); で呼びます。
追加:
package Catalyst::Plugin::DependenceModel; use strict; use base qw/Class::Data::Inheritable/; use NEXT; use Catalyst::Exception; use Module::Recursive::Require; __PACKAGE__->mk_classdata( '_depen_model_objs' ); our $VERSION = 0.01; sub setup { my $c = shift; my @args = @_; my $depen_model_pkg = $c->config->{depen_model}{package_name} || undef; Catalyst::Exception->throw( message => __PACKAGE__ . qq/: You need to setting "Dependence Model Package name"/ ) if !defined $depen_model_pkg; my $required_packages = Module::Recursive::Require ->new() ->require_of( $depen_model_pkg ); my $depen_mode_objs = {}; for my $reqire_package ( @$required_packages ) { $depen_mode_objs->{$reqire_package} = $reqire_package->new(); } $c->_depen_model_objs( $depen_mode_objs ); $c->NEXT::setup( @args ); } sub depen_model { my $c = shift; my $name = shift; my $package = $c->config->{depen_model}{package_name} . "::$name"; $c->_depen_model_objs->{$package}->c( $c ); return $c->_depen_model_objs->{$package}; } 1;