yamlに __path_to(foo/bar)__ とか書こう
こめったーのソースを見た二人が感心してたのでこのネタを書こうと思った。
こめったーの設定ファイルはyamlで、中にこんな記述がある。
View::Template: INCLUDE_PATH: - __path_to(root/template)__ - __path_to(root/template/default)__
この __path_to()__ って何よって言うとcatalyst使いは皆知ってる事だけど、C::P::ConfigLoaderではこう書くとyamlを読む際に引数の値をフルパスに変換してくれる。yamlが持ってる機能ではない。
便利なので Data::Visitor::Callback を使って実装。一部省略してるけど以下参照。実物はこちら(github)。
my $home = config->{home}; my $config = Config::Divide->load_config( \@config_paths, ); no warnings 'uninitialized'; my $v = Data::Visitor::Callback->new( scalar => sub {}, plain_value => sub { $_ = "$home/$1" if ($_ =~ /__path_to\((\S+)\)__/); }, ); $v->visit($config);
まずは$homeにアプリ配置場所を、$configにyamlの値を、それぞれ格納。
その後 Data::Visitor::Callback のインスタンス作って引数に自分がしたい処理を書いて、あとはインスタンスメソッドvisitの引数に $config 取って呼んで終わり。
ここでいうとアプリ配置場所は /var/www/commetter なので、ビフォーアフターはこうなると。
# before __path_to(root/template)__ # after /var/www/commetter/root/template
あら素敵。
あと俺がこのモジュールの存在を知ったのはこちら。色々素敵なネタを書いてくれる皆様に感謝。
http://d.hatena.ne.jp/fbis/20090610/1244604865