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   55 use 5.008000;
  4         10  
2 4     4   18 use utf8;
  4         5  
  4         17  
3 4     4   67 use strict;
  4         5  
  4         66  
4 4     4   25 use warnings;
  4         13  
  4         267  
5              
6             ###########################################################################
7             ###########################################################################
8              
9             { package Locale::KeyedText::Message; # class
10             BEGIN {
11 4     4   19 our $VERSION = '2.001001';
12 4         213 $VERSION = eval $VERSION;
13             }
14              
15 4     4   20 use Scalar::Util 'blessed';
  4         7  
  4         3216  
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   133 my $self = shift;
23 96 100       238 $self->{_msg_key} = $_[0] if scalar @_;
24 96         167 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   109 my $self = shift;
36 94 100       166 $self->{_msg_vars} = $_[0] if scalar @_;
37 94         174 return $self->{_msg_vars};
38             }
39              
40             ###########################################################################
41              
42             sub new {
43 26     26 0 7133 my ($class, @args) = @_;
44 26   33     109 $class = (blessed $class) || $class;
45              
46 26         55 my $params = $class->BUILDARGS( @args );
47              
48 26         48 my $self = bless {}, $class;
49              
50             # Set attribute default values.
51 26         60 $self->_msg_key( '' );
52 26         55 $self->_msg_vars( {} );
53              
54 26         60 $self->BUILD( $params );
55              
56 23         105 return $self;
57             }
58              
59             ###########################################################################
60              
61             sub BUILDARGS {
62 26     26 0 45 my ($class, @args) = @_;
63 26 50 33     102 if (@args == 1 and ref $args[0] eq 'HASH') {
    0          
64             # Constructor was called with (possibly zero) named arguments.
65 26         38 return { %{$args[0]} };
  26         106  
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 33 my ($self, $args) = @_;
81 26         34 my ($msg_key, $msg_vars_ref) = @{$args}{'msg_key', 'msg_vars'};
  26         49  
82              
83 26 100       49 if (!defined $msg_vars_ref) {
84 7         10 $msg_vars_ref = {};
85             }
86              
87 26         56 $self->_assert_arg_str( 'new', ':$msg_key!', $msg_key );
88 24         54 $self->_assert_arg_hash( 'new', ':%msg_vars?', $msg_vars_ref );
89              
90 23         42 $self->_msg_key( $msg_key );
91 23         27 $self->_msg_vars( {%{$msg_vars_ref}} );
  23         75  
92              
93 23         40 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 1201 my ($self) = @_;
110 24         42 return $self->_msg_key();
111             }
112              
113             sub get_msg_var {
114 5     5 0 3878 my ($self, $var_name) = @_;
115 5         18 $self->_assert_arg_str( 'get_msg_var', '$var_name!', $var_name );
116 3         7 return $self->_msg_vars()->{$var_name};
117             }
118              
119             sub get_msg_vars {
120 19     19 0 905 my ($self) = @_;
121 19         23 return {%{$self->_msg_vars()}};
  19         33  
122             }
123              
124             ###########################################################################
125              
126             sub as_debug_string {
127 11     11 0 1491 my ($self) = @_;
128 11         22 my $msg_key = $self->_msg_key();
129 11         24 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       153 ? $msg_vars->{$_} : q{}) . '"'
137 11         28 } sort keys %{$msg_vars}) . '}'
  11         48  
138             . "\n";
139             }
140              
141             use overload (
142 4         25 '""' => \&as_debug_string,
143             fallback => 1,
144 4     4   3273 );
  4         6101  
145              
146             sub as_debug_str {
147 12     12 0 11645 my ($self) = @_;
148 12         25 my $msg_key = $self->_msg_key();
149 12         19 my $msg_vars = $self->_msg_vars();
150             return $msg_key . ': ' . join ', ', map {
151             $_ . '='
152 13 100       62 . (defined $msg_vars->{$_} ? $msg_vars->{$_} : q{})
153 12         27 } sort keys %{$msg_vars};
  12         54  
154             }
155              
156             ###########################################################################
157              
158             sub _die_with_msg {
159 5     5   11 my ($self, $msg_key, $msg_vars_ref) = @_;
160 5   50     10 $msg_vars_ref ||= {};
161 5         9 $msg_vars_ref->{'CLASS'} = 'Locale::KeyedText::Message';
162 5         16 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   59 my ($self, $meth, $arg, $val) = @_;
168 31 100       56 $self->_die_with_msg( 'LKT_ARG_UNDEF',
169             { 'METH' => $meth, 'ARG' => $arg } )
170             if !defined $val;
171 29 100       76 $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   37 my ($self, $meth, $arg, $val) = @_;
178 24 50       53 $self->_die_with_msg( 'LKT_ARG_UNDEF',
179             { 'METH' => $meth, 'ARG' => $arg } )
180             if !defined $val;
181 24 50       46 $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       52 if exists $val->{q{}};
187             }
188              
189             ###########################################################################
190              
191             } # class Locale::KeyedText::Message
192              
193             ###########################################################################
194             ###########################################################################
195              
196             1;