$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Module::Setupで雛形に渡ってくる変数を理解する

 Module::SetupでWeb Application作るときの雛形を作ろうと思ったんですが、テンプレートファイルに渡ってくるパラメータがいまいちわからなかったので、コードを読んでみました。

ファイルに渡ってくる変数

実際のテンプレート作成はModule::Setupのcreate_skeletonというメソッドで行っています。

sub create_skeleton {
    my $self   = shift;
    my $config = $self->config;

    $self->{distribute} = Module::Setup::Distribute->new(
        $config->{module},
        target => $config->{target},
    );
    $self->call_trigger( 'after_setup_module_attribute' );
    $self->distribute->dist_path->mkpath;

    my $template_vars = {
        module      => $self->distribute->module,
        dist        => $self->distribute->dist_name,
        module_path => $self->distribute->module_path,
        module_unix_path => join('/', @{ $self->distribute->package }),
        config      => $config,
        distribute  => $self->distribute,
        localtime   => scalar localtime,
        moniker     => $self->distribute->package->[ scalar(@{ $self->distribute->package })-1 ],
    };
    $self->call_trigger( after_setup_template_vars => $template_vars);
    $self->{distribute}->set_template_vars($template_vars);

    for my $path ($self->base_dir->flavor->template->find_files) {
        $self->{distribute}->install_template($self, $path);
    }
    $self->call_trigger( 'append_template_file' );

    return $template_vars;
}

この中の$template_varsが渡ってくるパラメータになります。順に説明すると

  • module:指定したパッケージ名
  • dist:パッケージ名ハイフン区切り。ベースディレクトリ名。
  • module_path:Module::Setup::Path::Dirオブジェクト、パッケージのdirectory。文字列として使うとstringfyされる
  • config:コマンドラインで指定したoptionやconfigファイルの設定項目のハッシュ
  • distribute:Module::Setup::Distributeオブジェクト
  • localtime:time
  • moiker:パッケージ名::区切り最後の名前

ファイル名に渡ってくる変数

 Module::Setupでは____var-hogehoge-var____みたいな変数をファイル名に使うことができます。これはどうなっているかというとModule::Setup::Distributeに以下のようなコードが有りました。

$options->{dist_path} =~ s/____var-(.+?)-var____/$options->{vars}->{$1} || $options->{vars}->{config}->{$1}/eg;

この$options->{vars}には$template_varsが渡ってきているので、template_varsにわたしているパラメータなら____var-(変数名)-var____という名前でファイル名に使うことが出来ます。ちなみにファイル名がhoge/piyoとかであればちゃんとディレクトリも区切られます。

まとめ

というわけでコード読んでみたのをまとめてみました。間違って呼んでいる部分もあるかもしれませんので、そのあたりはご了承ください。。。