The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# ============================================================================
package CatalystX::I18N::Model::DataLocalize;
# ============================================================================

use namespace::autoclean;
use Moose;
extends 'CatalystX::I18N::Model::Base';

has 'data_localize' => (
    is          => 'rw',
    isa         => 'Data::Localize',
    lazy_build  => 1,
);

sub _build_data_localize {
    my ($self) = @_;

    # Get DataLocalize class
    my $class = $self->class || $self->_app .'::DataLocalize';

    # Load DataLocalize class
    my ($ok,$error) = Class::Load::try_load_class($class);
    Catalyst::Exception->throw(sprintf("Could not load '%s' : %s",$class,$error))
        unless $ok;

    Catalyst::Exception->throw(sprintf("Could initialize '%s' because is is not a 'Data::Localize' class",$class))
        unless $class->isa('Data::Localize');

    return $class->new();
}

sub BUILD {
    my ($self) = @_;

    my $loc = $self->data_localize;
    my $app = $self->_app;

    # Add localizers if possible
    if ($loc->can('add_localizers')) {
        my (@locales,$config);
        $config = $app->config->{I18N}{locales};
        @locales = keys %$config;
        $app->log->debug(sprintf("Adding localizers for locales %s",join(',',@locales)))
            if $app->debug;
        $loc->add_localizers(
            locales             => \@locales,
            directories         => $self->directories,
        );
    } else {
        $app->log->warn(sprintf("'%s' does not implement a 'add_localizers' method",ref($loc)))
    }

    $self->data_localize($loc);
    return;
}

sub ACCEPT_CONTEXT {
    my ( $self, $c ) = @_;

    my @languages = ($c->locale);
    push(@languages,@{$c->i18n_config->{_inherits}});

    # set locale and inheritance
    $self->data_localize->set_languages(@languages);

    return $self->data_localize;
}

__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
no Moose;
1;