The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package JLogger::Config;

use strict;
use warnings;

use YAML();

sub new {
    bless {}, shift;
}

sub load {
    my ($self, $config_text) = @_;

    my $config = YAML::Load($config_text);

    $self->_fix_element($config, 'transport');
    $self->_fix_elements($config, 'storages');
    $self->_fix_elements($config, 'filters');

    $config;
}

sub load_file {
    my ($self, $config_file) = @_;

    open my $fh, '<:encoding(UTF-8)', $config_file,
        or die qq(Can't open "$config_file": $!);

    my $config_text = do {
        local $/;
        <$fh>;
    };

    close $fh;

    $self->load($config_text);
}

sub _fix_element {
    my ($self, $config, $element_key) = @_;

    $config->{$element_key} =
      $self->_fix_element_value($config->{$element_key})
      if exists $config->{$element_key};
}

sub _fix_elements {
    my ($self, $config, $elements_key) = @_;

    if (exists $config->{$elements_key}) {
        $_ = $self->_fix_element_value($_) for @{$config->{$elements_key}};
    }
}

sub _fix_element_value {
    my ($self, $element) = @_;

    my $ref = ref $element;
    if ($ref eq '') {
        return [$element];
    }
    elsif ($ref eq 'HASH') {
        return [%$element];
    }

    $element;
}

1;