hide-Kさんとこのこれ→ http://blog.hide-k.net/archives/2008/02/catalystmodelad_1.php を読んでCatalyst::Model::AdaptorをつかってTheSchwartzをいじろうとしたんだけど、

Model::TheSchwartz:
  databases:
    -
      dsn: dbi:mysql:theschwartz
      user: root
      pass:

こういうyamlをConfig::Generalでは表現できなくて困った。

#!/usr/bin/perl

use strict;
use warnings;
use Config::General;
use Data::Dumper;

my $save = Config::General->new;
my $str = $save->save_string({
        databases => [
            {  
                dsn => 'dbi:mysql:theschwartz',
                user => 'root',
                pass => '',
            },
        ]
    });
warn $str;

my $load = Config::General->new(
    -String => $str,
);
warn Dumper { $load->getall };

こうすると、出力は

[danjou@sylvia] $ perl config_general.pl
<databases>
    pass   
    dsn   dbi:mysql:theschwartz
    user   root
</databases>
$VAR1 = {
          'databases' => {
                           'pass' => '',
                           'dsn' => 'dbi:mysql:theschwartz',
                           'user' => 'root'
                         }
        };

こうなってしまい、myapp_server.plを立ち上げると

[danjou@sylvia] $ perl ./script/myapp_server.pl
Couldn't instantiate component "MyApp::Model::TheSchwartz", "databases must be an arrayref if specified at /Library/Perl/5.8.8/Catalyst/Model/Adaptor/Base.pm line 27" at ./script/myapp_server.pl line 55
Compilation failed in require at ./script/myapp_server.pl line 55.

と言われる。ので、prepare_argumentsで帳尻を合わせた。

sub prepare_arguments {
    my ( $self, $app ) = @_;

    my $args = $app->config->{"Model::TheSchwartz"};
    if (ref $args->{databases} eq 'HASH') {
        $args->{databases} = [ $args->{databases} ];
    }
    return $args;
}

こんな感じでいいんだろうか。とりあえず動いた。