Perlでメソッドが存在しない時に呼ばれるメソッド(AUTOLOAD)
2015年2月26日
Amon2でModelを経由してDB(MySQL)にアクセスしてる(Amon2でModel作ってControllerから呼ぶ)んですが、C -> Model -> DBとつなぐ時に、Modelで処理が入る場合はいいんですが、Modelがただの経由地になってしまっている箇所がいくつかある(というか大半?)ので、Modelの親クラスにAUTOLOADを追加する事にしました。
package MyApp::Model::Base; sub new { # .. 処理 .. # ここで、$self->db() を追加。 # .. 処理 .. } sub AUTOLOAD { my ( $self, $args ) = @_; our $AUTOLOAD; my $class = ref $self; # MyApp::Model::User my $method = $AUTOLOAD; # MyApp::Model::User::search $method =~ s/$class\:\://; $class =~ s/^MyApp::Model:://; return $self->db->{ $class }->$method( $args ); } 1;
これでC::UserからModelを呼び出します。
元々書いていたModel::User->search()ってメソッドは削除。
(Model::Userの親クラスは、上で書いたModel::Baseです。)
my $user = $c->model->{'User'}->search({ name => 'hoge' });
てな感じで、Cから呼び出すと、Model::Userにsearchは、存在しないので、AUTOLOADが呼ばれて、DBにあるsearchが呼ばれるようになりました。
Model::User自体は必要ですが、いちいち中身を書く手間が省けるかなと。