読者です 読者をやめる 読者になる 読者になる

kopug memo

名古屋で働くとあるWebエンジニアの覚書。

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;