Yacafiの動作を読み解く
軽量フレームワークの話題が殆ど上がらなくなった感もあり、とってつけたような記事に思われない丁度いいタイミングかなーとか思ったのでやってみることにした。
wget http://svn.coderepos.org/share/lang/perl/Yacafi/trunk/lib/Yacafi.pm
以前Yacafiを使った掲示板を書いてた事があったけど、当時は細かい挙動とか全然分かってなかったから、方々からのコピペで更に理解不可能になり気味だった。理解を正確に行って、使えるような代物にするのが目的。
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辺りでも触る。