++ed by:
KES OALDERS BEROV

3 PAUSE users

Dotan Dimet דותן דימט
and 1 contributors

NAME

Mojolicious::Plugin::ConfigHashMerge - Perlish Configuration, with merging of deeply-nested defaults.

SYNOPSIS

  # myapp.conf (it's just Perl returning a hash, with possible nesting)
  {
    foo         => "bar",
    watch_dirs  => {
      music => app->home->rel_dir('music'),
      ebooks => app->home->rel_dir('ebooks')
    }
  };

  # Mojolicious
  my $config = $self->plugin('ConfigHashMerge', { options... } );

  # Mojolicious::Lite
  plugin ConfigHashMerge =>
  {
    default =>
    {
      watch_dirs => {
        downloads => app->home->rel_dir('downloads')
      }
    },
    file => 'myapp.conf' # will be loaded anyway
  };
  say $_ for (sort keys %{app->config->{watch_dirs}});
  # will print:
  # downloads
  # ebooks
  # music

DESCRIPTION

Mojolicious::Plugin::ConfigHashMerge behaves exactly like the standard plugin Mojolicious::Plugin::Config, except that it merges the defaults with the contents of the config file using Hash::Merge::Simple instead of flattening the two hashes into lists. This allows merging of deeply-nested config options.

The only change from the standard Config plugin is the replacement of these two lines:

   $config = {%$config, %{$self->load($mode, $conf, $app)}} if $mode;
   $config = {%{$conf->{default}}, %$config} if $conf->{default};

with these:

   $config = merge($config, $self->load($mode, $conf, $app)) if $mode;
   $config = merge($conf->{default}, $config) if $conf->{default};

So that if your defaults look like this:

  { optA => 42, optB => { victor => 1 }, optC => [2, 7, 8] }

And your config file looks like this:

  { optB => { alpha => 3 }, optC => 7 }

And your mode-specific config file looks like this:

  { optB => { test => 1 } }
The merged config will look like this:

  { optA => 42, optB => { alpha => 3, test => 1, victor => 1 }, optC => 7 }

Instead of like this (with the regular Config plugin):

  { optA => 42, optB => { test => 1 }, optC => 7 }

See Mojolicious::Plugin::Config for more.

Note that this plugin also supports the config_override option in Mojolicious version 7.29+, which allow you to override the config in your tests.

OPTIONS

Mojolicious::Plugin::ConfigHashMerge supports all options supported by Mojolicious::Plugin::Config.

METHODS

Mojolicious::Plugin::ConfigHashMerge inherits all methods from Mojolicious::Plugin::Config and implements the following new ones.

register

  $plugin->register(Mojolicious->new, { file => 'foo.conf', default => { ... } });

Register plugin in Mojolicious application. See Mojolicious::Plugin::Config for available config options.

SEE ALSO

Mojolicious, Mojolicious::Guides, http://mojolicio.us, Mojolicious::Plugin::Config