Mojolicious::Plugin::Config - Perlish Configuration Plugin


Mojolicious documentation Contained in the Mojolicious distribution.

Index


Code Index:

NAME

Top

Mojolicious::Plugin::Config - Perlish Configuration Plugin

SYNOPSIS

Top

  # myapp.conf
  {
    foo       => "bar",
    music_dir => app->home->rel_dir('music')
  };

  # Mojolicious
  my $config = $self->plugin('config');

  # Mojolicious::Lite
  my $config = plugin 'config';

  # Reads myapp.conf by default and puts the parsed version into the stash
  my $config = $self->stash('config');

  # Everything can be customized with options
  my $config = plugin config => {
    file      => '/etc/myapp.stuff',
    stash_key => 'conf'
  };

DESCRIPTION

Top

Mojolicious::Plugin::Config is a Perl-ish configuration plugin. The application object can be accessed via the app helper. You can extend the normal config file myapp.conf with mode specific ones like myapp.$mode.conf.

OPTIONS

Top

default

  # Mojolicious::Lite
  plugin config => {default => {foo => 'bar'}};

Default configuration.

ext

  # Mojolicious::Lite
  plugin config => {ext => 'stuff'};

File extension of config file, defaults to conf.

file

  # Mojolicious::Lite
  plugin config => {file => 'myapp.conf'};
  plugin config => {file => '/etc/foo.stuff'};

Configuration file, defaults to the value of MOJO_CONFIG or myapp.conf in the application home directory.

stash_key

  # Mojolicious::Lite
  plugin config => {stash_key => 'conf'};

Configuration stash key.

HELPERS

Top

config

  <%= config 'something' %>
  <%= config->{something} %>

Access config values.

METHODS

Top

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

load

  $plugin->load($file, $conf, $app);

Loads config file and passes the content to parse.

  sub load {
    my ($self, $file, $conf, $app) = @_;
    ...
    return $self->parse($content, $file, $conf, $app);
  }

parse

  $plugin->parse($content, $file, $conf, $app);

Parse config file.

  sub parse {
    my ($self, $content, $file, $conf, $app) = @_;
    ...
    return $hash;
  }

register

  $plugin->register;

Register plugin in Mojolicious application.

DEBUGGING

Top

You can set the MOJO_CONFIG_DEBUG environment variable to get some advanced diagnostics information printed to STDERR.

  MOJO_CONFIG_DEBUG=1

SEE ALSO

Top

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


Mojolicious documentation Contained in the Mojolicious distribution.

package Mojolicious::Plugin::Config;
use Mojo::Base 'Mojolicious::Plugin';

require File::Basename;
require File::Spec;

use constant DEBUG => $ENV{MOJO_CONFIG_DEBUG} || 0;

# "Who are you, my warranty?!"
sub load {
  my ($self, $file, $conf, $app) = @_;
  $app->log->debug(qq/Reading config file "$file"./);

  # Slurp UTF-8 file
  open my $handle, "<:encoding(UTF-8)", $file
    or die qq/Couldn't open config file "$file": $!/;
  my $content = do { local $/; <$handle> };

  # Process
  $self->parse($content, $file, $conf, $app);
}

sub parse {
  my ($self, $content, $file, $conf, $app) = @_;

  # Run Perl code
  no warnings;
  die qq/Couldn't parse config file "$file": $@/
    unless my $config = eval "sub app { \$app }; $content";
  die qq/Config file "$file" did not return a hashref.\n/
    unless ref $config && ref $config eq 'HASH';

  $config;
}

sub register {
  my ($self, $app, $conf) = @_;
  $conf ||= {};

  # File
  my $file = $conf->{file} || $ENV{MOJO_CONFIG};
  unless ($file) {

    # Basename
    $file = File::Basename::basename($ENV{MOJO_EXE} || $0);

    # Remove .pl, .p6 and .t extentions
    $file =~ s/(?:\.p(?:l|6))|\.t$//i;

    # Default extension
    $file .= '.' . ($conf->{ext} || 'conf');
  }
  warn "CONFIG FILE $file\n" if DEBUG;

  # Mode specific config file
  my $mode;
  if ($file =~ /^(.*)\.([^\.]+)$/) {
    $mode = join '.', $1, $app->mode, $2;
    warn "MODE SPECIFIC CONFIG FILE $mode\n" if DEBUG;
  }

  # Absolute path
  $file = $app->home->rel_file($file)
    unless File::Spec->file_name_is_absolute($file);
  $mode = $app->home->rel_file($mode)
    if defined $mode && !File::Spec->file_name_is_absolute($mode);

  # Read config file
  my $config = {};
  if (-e $file) { $config = $self->load($file, $conf, $app) }

  # Check for default
  else {

    # All missing
    die qq/Config file "$file" missing, maybe you need to create it?\n/
      unless $conf->{default};
    $app->log->debug(qq/Config file "$file" missing, using default config./);
  }

  # Merge everything
  $config = {%$config, %{$self->load($mode, $conf, $app)}}
    if defined $mode && -e $mode;
  $config = {%{$conf->{default}}, %$config} if $conf->{default};

  # Add "config" helper
  $app->helper(
    config => sub {
      my $self = shift;
      return $config unless @_;
      $config->{$_[0]};
    }
  );

  # Add default stash value
  $app->defaults(($conf->{stash_key} || 'config') => $config);

  $config;
}

1;
__END__