あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Yacafiの動作を読み解く

軽量フレームワークの話題が殆ど上がらなくなった感もあり、とってつけたような記事に思われない丁度いいタイミングかなーとか思ったのでやってみることにした。

wget http://svn.coderepos.org/share/lang/perl/Yacafi/trunk/lib/Yacafi.pm

以前Yacafiを使った掲示板を書いてた事があったけど、当時は細かい挙動とか全然分かってなかったから、方々からのコピペで更に理解不可能になり気味だった。理解を正確に行って、使えるような代物にするのが目的。

2 〜 36行目

YacafiのTemplateに関する各種環境設定。

 our $TEMPLATE_PARAMS = +{

の +{ については、perlrefを見ると分かる。

42 〜 75行目

  • import
45    my $caller = caller;
46    $CURRENT_CLASS = $args{current_class} || $caller;

引数にcurrent_classをkeyとした値を渡すと、それが基本classとして扱われる。そうでなければmainが基本classになる。

実際に書くとすると、

use Yacafi current_class => 'hogehoge';

という具合。

  • pre config
 49     if (   exists $args{extends}
 50         && exists $args{extends}->{template}
 51         && ref( $args{extends}->{template}->{params} ) eq 'HASH' )
 52     {
 53         while ( my ( $key, $val )
 54             = each %{ $args{extends}->{template}->{params} } )
 55         {
 56             $TEMPLATE_PARAMS->{$key} = $val;
 57         }
 58     }

指定のハッシュが渡されていれば、templateのパラメータを指定。
実際に書くと、

use Yacafi current_class => 'hogehoge', extends => {
    template => {
        params => {
            tag_start => '<tmt',
            tag_end   => 'tmt>',
        },
    },
};

こんな具合。params内の指定は24〜35行目のkey。

60 〜 61行目

pack

 60     # create a pack file$
 61     _pack(%args) if @ARGV && $ARGV[0] eq '--pack';$
perl hogehoge.cgi --pack > hogehoge.cgi

な感じで、Yacafi.pm + index.cgiなファイルを作るコマンドのための行。_pack自体は77〜141行に。

63 〜 72行目

function export

 63     # functions export
 64     no strict 'refs';
 65     for my $name (qw/ dispatch query controller model view redirect filter /    )
 66     {
 67         *{ $caller . '::' . $name } = \&{$name};
 68     }
 69     if ( exists $args{extends} && exists $args{extends}->{template} ) {
 70         *{ $caller . '::view_template' } = \&view_template_nocompile;
 71     }
 72 

呼び出し元のスクリプトへ、メソッドを定義する。

  • dispatch
  • query
  • controller
  • model
  • view
  • redirect
  • filter

が使えるという具合に。
なお、

use Yacafi extends => { template => { params => .... } };

のようにtemplateを定義しておくと、view_templateメソッドで 407 〜 414行目のview_template_no_compileが呼び出されるようになる。

次は_pack辺りでも触る。