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

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

use CatalystX::I18N::TypeConstraints;
use Path::Class;
use Scalar::Util qw(weaken);

has 'gettext_style' => (
    is          => 'rw',
    isa         => 'Bool',
    default     => 1,
);

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

    my $class = $self->class;

    # Load Maketext 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 'Locale::Maketext' class",$class))
        unless $class->isa('Locale::Maketext');

    my $app = $self->_app;

    # Load lexicons in the Maketext class if possible
    if ($class->can('load_lexicon')) {
        my (@locales,%inhertiance,$config);
        $config = $app->config->{I18N}{locales};
        foreach my $locale (keys %$config) {
            push(@locales,$locale);
            $inhertiance{$locale} = $config->{$locale}{inherits}
                if defined $config->{$locale}{inherits};
        }
        $app->log->debug(sprintf("Loading maketext lexicons for locales %s",join(',',@locales)))
            if $app->debug;

        $class->load_lexicon(
            locales             => \@locales,
            directories         => $self->directories,
            gettext_style       => $self->gettext_style,
            inheritance         => \%inhertiance,
        );
    } else {
        $app->log->warn(sprintf("'%s' does not implement a 'load_lexicon' method",$class))
    }

    return;
}

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

    # set locale and fallback
    my $handle = $self->class->get_handle( $c->locale );

    # Catch error
    Catalyst::Exception->throw(sprintf("Could not fetch lanuage handle for locale '%s'",$c->locale))
        unless ( scalar $handle );

    if ($self->can('fail_with')) {
        weaken($c);
        $handle->fail_with( sub {
            $self->fail_with($c,@_);
        } );
    } else {
        $handle->fail_with( sub { } );
    }

    return $handle;
}

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

=encoding utf8

=head1 NAME

CatalystX::I18N::Model::Maketext - Glues Locale::Maketext into Catalyst

=head1 SYNOPSIS

 # In your catalyst base class
 package MyApp::Catalyst;
 use Catalyst qw/CatalystX::I18N::Role::Base/;
 
 __PACKAGE__->config(
    'Model::Maketext' => {
        class           => 'MyApp::Maketext', # optional
        directories     => '/path/to/maketext/files', # optional
    },
 );


 # Create a model class
 package MyApp::Model::Maketext;
 use parent qw/CatalystX::I18N::Model::Maketext/;


 # Create a Maketext class (must be a Locale::Maketext class)
 package MyApp::Maketext;
 use parent qw/CatalystX::I18N::Maketext/;


 # In your controller class(es)
 package MyApp::Controller::Main;
 use parent qw/Catalyst::Controller/;

 sub action : Local {
     my ($self,$c) = @_;
     
     my $model = $c->model('Maketext');
     $c->stash->{title} = $model->maketext('Hello world');
     # See CatalystX::I18N::Role::Maketext for a convinient wrapper
 }

=head1 DESCRIPTION

This model glues a L<Locale::Maketext> class
(eg. L<CatalystX::I18N::Maketext>) into you Catalyst application.

The method C<fail_with> will be called for each missing msgid if present
in your model class.

 package MyApp::Model::Maketext;
 use parent qw/CatalystX::I18N::Model::Maketext/;
 
 sub fail_with {
     my ($self,$c,$language_handle,$msgid,$params) = @_;
     # Do somenthing clever
     return $string;
 }

See L<Catalyst::Helper::Model::Maketext> for gerating an Maketext model from
the command-line.

=head1 CONFIGURATION

=head3 class

Set the L<Locale::Maketext> class you want to use from this model.

Defaults to $APPNAME::Maketext

=head3 gettext_style

Enable gettext style. C<%quant(%1,document,documents)> instead of
C<[quant,_1,document,documents]>

Default TRUE

=head3 directories

Array reference of directories to be searched for maketext files.

See L<CatalystX::I18N::Maketext> for more details on the C<directory>
parameter

=head1 SEE ALSO

L<CatalystX::I18N::Maketext>, L<Locale::Maketext>,
L<Locale::Maketext::Lexicon> and L<CatalystX::I18N::Role::Maketext>

=head1 AUTHOR

    Maroš Kollár
    CPAN ID: MAROS
    maros [at] k-1.com
    
    L<http://www.k-1.com>