Amon2でMODE共用のconfigファイルを読み込んで使う。

Amon2は、configをdevelopmentとproductionの読み替えができるんで、DB接続周りとかの変更が可能なんですが、その他の部分で同じ内容がいくつかあって、いちいちconfigを全部変えるがめんどいので、共通な内容は別のconfigファイル(どのMODEでも読み込まれる共用ファイル)にしとこうと思います。

package MyApp;
use parent qw/Amon2/;

use Amon2::Config::Simple;
use FindBin;
use Path::Class;

sub load_config {
    my $self = shift;
    my $base_dir = "$FindBin::Bin/../config/share";

    # 通常のconfig(development.plとか、production.plとか)
    my $config = Amon2::Config::Simple->load($self, +{ environment => $ENV{RUN_MODE} });

    my $share_config = {};
    # config/share/以下のファイルを全部処理
    dir($base_dir)->recurse(
        callback => sub {
            my $file = shift; # フルパス /home/user/myapp/config/share/xxxxxx.pl
            if ( $file =~ /\/(\w+?)\.pl$/ ) {
                my $class = $1; # ファイル名を取得

                my $fname = File::Spec->catfile( $file );
                my $share = do $fname;

                Carp::croak("$fname: $@") if $@;
                Carp::croak("$fname: $!") unless defined $share;
                unless ( ref($config) eq 'HASH' ) {
                    Carp::croak("$fname does not return HashRef.");
                }

                $share_config->{ $class } = $share;
            }
        }
    );

    # configに追加
    $config->{'share'} = $share_config;

    return $config;
}

Path::Classを使って、config/share/以下のファイルを探す。
ファイルを読み込む部分は、Amon2::Config::Simpleほぼそのままコピペ。
複数のconfigファイルを置いたとしても、全部読み込まれる。

config/share/****.pl
config/share/****.pl
config/share/****.pl

例えば、config/share/hogehoge.plを追加した場合は、

#$c->config->{'share'}->{ファイル名}->{中身}
$c->config->{'share'}->{'hogehoge'}

みたいな感じでコントローラーからアクセスできる。