Perlでメソッドが存在しない時に呼ばれるメソッド(AUTOLOAD)

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自体は必要ですが、いちいち中身を書く手間が省けるかなと。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください