| 1 | package FormValidator::LazyWay::Message; |
|---|
| 2 | |
|---|
| 3 | use Moose; |
|---|
| 4 | use Data::Dumper; |
|---|
| 5 | use Carp; |
|---|
| 6 | use UNIVERSAL::require; |
|---|
| 7 | |
|---|
| 8 | has rule => ( is => 'ro', isa => 'FormValidator::LazyWay::Rule' ); |
|---|
| 9 | has config => ( is => 'ro', isa => 'HashRef' ); |
|---|
| 10 | has alias => ( is => 'ro', isa => 'HashRef' ); |
|---|
| 11 | has lang => ( is => 'ro' ); |
|---|
| 12 | has langs => ( is => 'ro', isa => 'ArrayRef' ); |
|---|
| 13 | has rule_message => ( is => 'ro', isa => 'HashRef' ); |
|---|
| 14 | |
|---|
| 15 | sub BUILD { |
|---|
| 16 | my $self = shift; |
|---|
| 17 | $self->_set_lang(); |
|---|
| 18 | $self->{rule_message} = $self->_finalize_rule_message( $self->_load_rule_message() ); |
|---|
| 19 | } |
|---|
| 20 | |
|---|
| 21 | sub _finalize_rule_message { |
|---|
| 22 | my $self = shift; |
|---|
| 23 | my $rule_message = shift; |
|---|
| 24 | |
|---|
| 25 | my $message_storage = {}; |
|---|
| 26 | foreach my $lang ( @{ $self->langs } ) { |
|---|
| 27 | foreach my $level ( keys %{ $self->rule->constraints } ) { |
|---|
| 28 | foreach my $field ( keys %{ $self->rule->constraints->{$level} } ) { |
|---|
| 29 | for my $item ( @{ $self->rule->constraints->{$level}{$field} } ){ |
|---|
| 30 | my $message = $rule_message->{$lang}{ $item->{label} }; |
|---|
| 31 | foreach my $key ( keys %{$item->{args}}) { |
|---|
| 32 | my $regexp = '\$_\[' . $key . '\]'; |
|---|
| 33 | my $value = $item->{args}{$key}; |
|---|
| 34 | $message =~ s/$regexp/$value/g; |
|---|
| 35 | } |
|---|
| 36 | $message_storage->{$lang}{$level}{$field}{$item->{label}} = $message; |
|---|
| 37 | } |
|---|
| 38 | } |
|---|
| 39 | } |
|---|
| 40 | } |
|---|
| 41 | |
|---|
| 42 | return $message_storage; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | sub get { |
|---|
| 46 | my $self = shift; |
|---|
| 47 | my $params = shift; |
|---|
| 48 | return $self->message_storage->{$params->{lang}}{$params->{level}}{$params->{field}}{$params->{label}} ; |
|---|
| 49 | } |
|---|
| 50 | |
|---|
| 51 | sub _set_lang { |
|---|
| 52 | my $self = shift; |
|---|
| 53 | $self->{lang} = $self->config->{lang} || 'en'; |
|---|
| 54 | $self->{langs} = $self->config->{langs} || [ $self->lang ]; |
|---|
| 55 | } |
|---|
| 56 | |
|---|
| 57 | sub _load_rule_message { |
|---|
| 58 | my $self = shift; |
|---|
| 59 | |
|---|
| 60 | my @subs = ( |
|---|
| 61 | sub { $self->_load_from_config(@_) }, |
|---|
| 62 | sub { $self->_load_from_rule(@_) }, |
|---|
| 63 | sub { $self->_loading_error(@_) }, |
|---|
| 64 | ); |
|---|
| 65 | |
|---|
| 66 | my %message = (); |
|---|
| 67 | LANG: |
|---|
| 68 | for my $lang ( @{ $self->langs } ) { |
|---|
| 69 | $self->_loading_modules($lang); |
|---|
| 70 | LABEL: |
|---|
| 71 | foreach my $label ( keys %{ $self->rule->labels } ) { |
|---|
| 72 | MESSAGE: |
|---|
| 73 | for my $sub (@subs) { |
|---|
| 74 | my $message = $sub->( $lang, $label, $self->rule->labels->{$label} ); |
|---|
| 75 | $message{$lang}{$label} = $message; |
|---|
| 76 | last MESSAGE if $message; |
|---|
| 77 | } |
|---|
| 78 | } |
|---|
| 79 | } |
|---|
| 80 | return \%message; |
|---|
| 81 | } |
|---|
| 82 | |
|---|
| 83 | sub _loading_modules { |
|---|
| 84 | my $self = shift; |
|---|
| 85 | my $lang = shift; |
|---|
| 86 | for my $module ( @{ $self->rule->modules } ) { |
|---|
| 87 | my $package = $module . '::' . uc $lang; |
|---|
| 88 | $package->require; |
|---|
| 89 | } |
|---|
| 90 | } |
|---|
| 91 | |
|---|
| 92 | sub _loading_error { |
|---|
| 93 | my $self = shift; |
|---|
| 94 | my $lang = shift; |
|---|
| 95 | my $label = shift; |
|---|
| 96 | croak sprintf( "You neet to have rule message for lang:%s label:%s", |
|---|
| 97 | $lang, $label ); |
|---|
| 98 | return; |
|---|
| 99 | } |
|---|
| 100 | |
|---|
| 101 | sub _load_from_config { |
|---|
| 102 | my $self = shift; |
|---|
| 103 | my $lang = shift; |
|---|
| 104 | my $label = shift; |
|---|
| 105 | |
|---|
| 106 | my $config = $self->config->{messages}; |
|---|
| 107 | return $config->{$lang}{rule}{$label} if $config->{$lang}{rule}{$label}; |
|---|
| 108 | |
|---|
| 109 | my $alias = $self->rule->labels->{$label}{alias}; |
|---|
| 110 | return unless $alias; |
|---|
| 111 | return $config->{$lang}{rule}{$alias} if $config->{$lang}{rule}{$alias}; |
|---|
| 112 | |
|---|
| 113 | return; |
|---|
| 114 | |
|---|
| 115 | } |
|---|
| 116 | |
|---|
| 117 | sub _load_from_rule { |
|---|
| 118 | my $self = shift; |
|---|
| 119 | my $lang = shift; |
|---|
| 120 | my $label = shift; |
|---|
| 121 | my $package_info = shift; |
|---|
| 122 | my $package = $package_info->{package} . '::' . uc $lang; |
|---|
| 123 | my $method = $package . '::' . $package_info->{method}; |
|---|
| 124 | |
|---|
| 125 | my $message; |
|---|
| 126 | no strict 'refs'; |
|---|
| 127 | eval { $message = $method->(); }; |
|---|
| 128 | |
|---|
| 129 | return $message; |
|---|
| 130 | } |
|---|
| 131 | |
|---|
| 132 | 1; |
|---|