だるろぐ

だるいぶろぐです

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