root/lang/perl/FormValidator-LazyWay/branches/rebuild/lib/FormValidator/LazyWay/Message.pm @ 13760

Revision 13760, 3.6 kB (checked in by tomyhero, 5 years ago)

lang/perl/FormValidator::LazyWay? : add test from finalize_message

Line 
1package FormValidator::LazyWay::Message;
2
3use Moose;
4use Data::Dumper;
5use Carp;
6use UNIVERSAL::require;
7
8has rule         => ( is => 'ro', isa => 'FormValidator::LazyWay::Rule' );
9has config       => ( is => 'ro', isa => 'HashRef' );
10has alias        => ( is => 'ro', isa => 'HashRef' );
11has lang         => ( is => 'ro' );
12has langs        => ( is => 'ro', isa => 'ArrayRef' );
13has rule_message => ( is => 'ro', isa => 'HashRef' );
14
15sub BUILD {
16    my $self = shift;
17    $self->_set_lang();
18    $self->{rule_message} = $self->_finalize_rule_message( $self->_load_rule_message() );
19}
20
21sub _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
45sub get {
46    my $self = shift;
47    my $params = shift;
48    return $self->message_storage->{$params->{lang}}{$params->{level}}{$params->{field}}{$params->{label}} ;
49}
50
51sub _set_lang {
52    my $self = shift;
53    $self->{lang}  = $self->config->{lang}  || 'en';
54    $self->{langs} = $self->config->{langs} || [ $self->lang ];
55}
56
57sub _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 = ();
67LANG:
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
83sub _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
92sub _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
101sub _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
117sub _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
1321;
Note: See TracBrowser for help on using the browser.