File Coverage

blib/lib/Locale/KeyedText/Message.pm
Criterion Covered Total %
statement 79 84 94.0
branch 18 24 75.0
condition 3 8 37.5
subroutine 20 21 95.2
pod 0 9 0.0
total 120 146 82.1


line stmt bran cond sub pod time code
1 4     4   45 use 5.008001;
  4         8  
2 4     4   11 use utf8;
  4         3  
  4         14  
3 4     4   55 use strict;
  4         4  
  4         48  
4 4     4   9 use warnings;
  4         3  
  4         202  
5              
6             ###########################################################################
7             ###########################################################################
8              
9             { package Locale::KeyedText::Message; # class
10             BEGIN {
11 4     4   6 our $VERSION = '2.001000';
12 4         192 $VERSION = eval $VERSION;
13             }
14              
15 4     4   14 use Scalar::Util 'blessed';
  4         5  
  4         2159  
16              
17             # has _msg_key
18             # isa Str
19             # default ''
20             # The machine-readable key that uniquely ident this message.
21             sub _msg_key {
22 96     96   74 my $self = shift;
23 96 100       207 $self->{_msg_key} = $_[0] if scalar @_;
24 96         119 return $self->{_msg_key};
25             }
26              
27             # has _msg_vars
28             # isa HashRef
29             # One elem per var:
30             # hkey is Str - var name
31             # hval is Any - current value for var
32             # default {}
33             # Named variables for messages, if any, go here.
34             sub _msg_vars {
35 94     94   79 my $self = shift;
36 94 100       122 $self->{_msg_vars} = $_[0] if scalar @_;
37 94         137 return $self->{_msg_vars};
38             }
39              
40             ###########################################################################
41              
42             sub new {
43 26     26 0 2623 my ($class, @args) = @_;
44 26   33     110 $class = (blessed $class) || $class;
45              
46 26         37 my $params = $class->BUILDARGS( @args );
47              
48 26         40 my $self = bless {}, $class;
49              
50             # Set attribute default values.
51 26         38 $self->_msg_key( '' );
52 26         34 $self->_msg_vars( {} );
53              
54 26         39 $self->BUILD( $params );
55              
56 23         85 return $self;
57             }
58              
59             ###########################################################################
60              
61             sub BUILDARGS {
62 26     26 0 30 my ($class, @args) = @_;
63 26 50 33     100 if (@args == 1 and ref $args[0] eq 'HASH') {
    0          
64             # Constructor was called with (possibly zero) named arguments.
65 26         17 return { %{$args[0]} };
  26         105  
66             }
67             elsif ((scalar @args % 2) == 0) {
68             # Constructor was called with (possibly zero) named arguments.
69 0         0 return { @args };
70             }
71             else {
72             # Constructor was called with odd number positional arguments.
73 0         0 $class->_die_with_msg( 'LKT_ARGS_BAD_PSEUDO_NAMED' );
74             }
75             }
76              
77             ###########################################################################
78              
79             sub BUILD {
80 26     26 0 23 my ($self, $args) = @_;
81 26         21 my ($msg_key, $msg_vars_ref) = @{$args}{'msg_key', 'msg_vars'};
  26         34  
82              
83 26 100       43 if (!defined $msg_vars_ref) {
84 7         7 $msg_vars_ref = {};
85             }
86              
87 26         38 $self->_assert_arg_str( 'new', ':$msg_key!', $msg_key );
88 24         34 $self->_assert_arg_hash( 'new', ':%msg_vars?', $msg_vars_ref );
89              
90 23         34 $self->_msg_key( $msg_key );
91 23         18 $self->_msg_vars( {%{$msg_vars_ref}} );
  23         53  
92              
93 23         28 return;
94             }
95              
96             ###########################################################################
97              
98             sub export_as_hash {
99 0     0 0 0 my ($self) = @_;
100             return {
101             'msg_key' => $self->_msg_key(),
102 0         0 'msg_vars' => {%{$self->_msg_vars()}},
  0         0  
103             };
104             }
105              
106             ###########################################################################
107              
108             sub get_msg_key {
109 24     24 0 262 my ($self) = @_;
110 24         28 return $self->_msg_key();
111             }
112              
113             sub get_msg_var {
114 5     5 0 1017 my ($self, $var_name) = @_;
115 5         8 $self->_assert_arg_str( 'get_msg_var', '$var_name!', $var_name );
116 3         6 return $self->_msg_vars()->{$var_name};
117             }
118              
119             sub get_msg_vars {
120 19     19 0 245 my ($self) = @_;
121 19         14 return {%{$self->_msg_vars()}};
  19         21  
122             }
123              
124             ###########################################################################
125              
126             sub as_debug_string {
127 11     11 0 193 my ($self) = @_;
128 11         16 my $msg_key = $self->_msg_key();
129 11         15 my $msg_vars = $self->_msg_vars();
130             return ' Debug String of a Locale::KeyedText::Message object:'
131             . "\n"
132             . ' $msg_key: "' . $msg_key . '"'
133             . "\n"
134             . ' %msg_vars: {' . (join q{, }, map {
135             '"' . $_ . '"="' . (defined $msg_vars->{$_}
136 37 50       119 ? $msg_vars->{$_} : q{}) . '"'
137 11         26 } sort keys %{$msg_vars}) . '}'
  11         38  
138             . "\n";
139             }
140              
141             use overload (
142 4         25 '""' => \&as_debug_string,
143             fallback => 1,
144 4     4   2613 );
  4         2167  
145              
146             sub as_debug_str {
147 12     12 0 1197 my ($self) = @_;
148 12         16 my $msg_key = $self->_msg_key();
149 12         15 my $msg_vars = $self->_msg_vars();
150             return $msg_key . ': ' . join ', ', map {
151             $_ . '='
152 13 100       47 . (defined $msg_vars->{$_} ? $msg_vars->{$_} : q{})
153 12         16 } sort keys %{$msg_vars};
  12         46  
154             }
155              
156             ###########################################################################
157              
158             sub _die_with_msg {
159 5     5   5 my ($self, $msg_key, $msg_vars_ref) = @_;
160 5   50     8 $msg_vars_ref ||= {};
161 5         6 $msg_vars_ref->{'CLASS'} = 'Locale::KeyedText::Message';
162 5         11 die Locale::KeyedText::Message->new({
163             'msg_key' => $msg_key, 'msg_vars' => $msg_vars_ref });
164             }
165              
166             sub _assert_arg_str {
167 31     31   33 my ($self, $meth, $arg, $val) = @_;
168 31 100       46 $self->_die_with_msg( 'LKT_ARG_UNDEF',
169             { 'METH' => $meth, 'ARG' => $arg } )
170             if !defined $val;
171 29 100       62 $self->_die_with_msg( 'LKT_ARG_EMP_STR',
172             { 'METH' => $meth, 'ARG' => $arg } )
173             if $val eq q{};
174             }
175              
176             sub _assert_arg_hash {
177 24     24   22 my ($self, $meth, $arg, $val) = @_;
178 24 50       38 $self->_die_with_msg( 'LKT_ARG_UNDEF',
179             { 'METH' => $meth, 'ARG' => $arg } )
180             if !defined $val;
181 24 50       35 $self->_die_with_msg( 'LKT_ARG_NO_HASH',
182             { 'METH' => $meth, 'ARG' => $arg, 'VAL' => $val } )
183             if ref $val ne 'HASH';
184             $self->_die_with_msg( 'LKT_ARG_HASH_KEY_EMP_STR',
185             { 'METH' => $meth, 'ARG' => $arg } )
186 24 100       47 if exists $val->{q{}};
187             }
188              
189             ###########################################################################
190              
191             } # class Locale::KeyedText::Message
192              
193             ###########################################################################
194             ###########################################################################
195              
196             1;