CGI::Application インターナル(1) dispatcher

CGI::Applicationがrun modeに対応したサブルーチンを呼び出す処理はすごく簡単。$rm='view'とすると、$self->$rm()を実行することによって$self->view()が呼び出されるという仕組みのようです。"strict refs"に引っかかるんじゃないのかなあ、と思うけど、メソッドとして実行する場合は関数名自体をリファレンスとしても問題ないみたいです*1

use strict;
package Sample;

sub new{
    return bless({}, $_[0]);
}
sub run{
    my ($self, $rm) = @_;
    eval {
        $self->$rm();
    };
}
sub a{
    print "a\n";
}

package main;

my $f = new Sample();
$f->run($ARGV[0]);
$ perl sample.pl a
a

こんなかんじ。この技はどこかで応用できるんじゃないかなあ・・・と思ったり。

*1:$rm->()として実行すると引っかかります