package FormValidator::Simple::Messages; use strict; use base 'Class::Accessor::Fast'; use YAML; use FormValidator::Simple::Exception; __PACKAGE__->mk_accessors(qw/decode_from/); use Encode; sub new { my $class = shift; my $self = bless { _data => undef, _format => "%s", }, $class; return $self; } sub format { my ($self, $format) = @_; if ($format) { $self->{_format} = $format; } $self->{_format}; } sub load { my ($self, $data) = @_; if (ref $data eq 'HASH') { $self->{_data} = $data; } elsif (-e $data && -f _ && -r _) { eval { $self->{_data} = YAML::LoadFile($data); }; if ($@) { FormValidator::Simple::Exception->throw( qq/failed to load YAML file. "$@"/ ); } } else { FormValidator::Simple::Exception->throw( qq/set hash reference or YAML file path./ ); } } sub get { my $self = shift; my $msg = $self->_get(@_); if ($self->decode_from && !Encode::is_utf8($msg)) { $msg = Encode::decode($self->decode_from, $msg); } return sprintf $self->format, $msg; } sub _get { my ($self, $action, $name, $type) = @_; my $data = $self->{_data}; unless ($data) { FormValidator::Simple::Exception->throw( qq/set messages before calling get()./ ); } unless ( $action && exists $data->{$action} ) { if ( exists $data->{DEFAULT} ) { if ( exists $data->{DEFAULT}{$name} ) { my $conf = $data->{DEFAULT}{$name}; if ( exists $conf->{$type} ) { return $conf->{$type}; } elsif ( exists $conf->{DEFAULT} ) { return $conf->{DEFAULT}; } } else { return "$name is invalid."; } } else { return "$name is invalid."; } } if ( exists $data->{$action}{$name} ) { my $conf = $data->{$action}{$name}; if ( exists $conf->{$type} ) { return $conf->{$type}; } elsif ( exists $conf->{DEFAULT} ) { return $conf->{DEFAULT}; } elsif ( exists $data->{DEFAULT} && exists $data->{DEFAULT}{$name} ) { my $conf = $data->{DEFAULT}{$name}; if ( exists $conf->{$type} ) { return $conf->{$type}; } elsif ( exists $conf->{DEFAULT} ) { return $conf->{DEFAULT}; } } } elsif ( exists $data->{DEFAULT} && exists $data->{DEFAULT}{$name} ) { my $conf = $data->{DEFAULT}{$name}; if ( exists $conf->{$type} ) { return $conf->{$type}; } elsif ( exists $conf->{DEFAULT} ) { return $conf->{DEFAULT}; } } return "$name is invalid."; } 1; __END__