| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  |  | 
| 2 |  |  |  |  |  |  | use strict; | 
| 3 | 47 |  |  | 47 |  | 397582 |  | 
|  | 47 |  |  |  |  | 118 |  | 
|  | 47 |  |  |  |  | 1175 |  | 
| 4 |  |  |  |  |  |  | use Carp; | 
| 5 | 47 |  |  | 47 |  | 197 |  | 
|  | 47 |  |  |  |  | 77 |  | 
|  | 47 |  |  |  |  | 2128 |  | 
| 6 |  |  |  |  |  |  | use base 'Rose::HTML::Object::Exporter'; | 
| 7 | 47 |  |  | 47 |  | 227 |  | 
|  | 47 |  |  |  |  | 75 |  | 
|  | 47 |  |  |  |  | 17971 |  | 
| 8 |  |  |  |  |  |  | our $VERSION = '0.618'; | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | our $Debug = 0; | 
| 11 |  |  |  |  |  |  |  | 
| 12 |  |  |  |  |  |  | use Rose::Class::MakeMethods::Generic | 
| 13 |  |  |  |  |  |  | ( | 
| 14 |  |  |  |  |  |  | inheritable_scalar => | 
| 15 | 47 |  |  |  |  | 203 | [ | 
| 16 |  |  |  |  |  |  | '_message_names', | 
| 17 |  |  |  |  |  |  | 'message_id_to_name_map', | 
| 18 |  |  |  |  |  |  | 'message_name_to_id_map', | 
| 19 |  |  |  |  |  |  | ], | 
| 20 |  |  |  |  |  |  | ); | 
| 21 | 47 |  |  | 47 |  | 476 |  | 
|  | 47 |  |  |  |  | 102 |  | 
| 22 |  |  |  |  |  |  | BEGIN | 
| 23 |  |  |  |  |  |  | { | 
| 24 |  |  |  |  |  |  | __PACKAGE__->_message_names([]); | 
| 25 | 47 |  |  | 47 |  | 11588 | __PACKAGE__->message_id_to_name_map({}); | 
| 26 | 47 |  |  |  |  | 491 | __PACKAGE__->message_name_to_id_map({}); | 
| 27 | 47 |  |  |  |  | 312 | } | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | { | 
| 30 |  |  |  |  |  |  | my($class) = shift; | 
| 31 |  |  |  |  |  |  |  | 
| 32 | 139 |  |  | 139 | 0 | 274 | my $list = $class->message_names; | 
| 33 |  |  |  |  |  |  |  | 
| 34 | 139 |  |  |  |  | 393 | $class->export_tags | 
| 35 |  |  |  |  |  |  | ( | 
| 36 |  |  |  |  |  |  | all    => $list, | 
| 37 |  |  |  |  |  |  | field  => [ grep { /^FIELD_/ } @$list ], | 
| 38 |  |  |  |  |  |  | form   => [ grep { /^FORM_/ } @$list ], | 
| 39 | 6283 |  |  |  |  | 10913 | date   => [ grep { /^DATE_|_(?:YEAR|MONTH|DAY)$/ } @$list ], | 
| 40 | 6283 |  |  |  |  | 8971 | time   => [ grep { /^TIME_|_(?:HOUR|MINUTE|SECOND)$/ } @$list ], | 
| 41 | 6283 |  |  |  |  | 18319 | email  => [ grep { /^EMAIL_/ } @$list ], | 
| 42 | 6283 |  |  |  |  | 17410 | phone  => [ grep { /^PHONE_/ } @$list ], | 
| 43 | 6283 |  |  |  |  | 8731 | number => [ grep { /^NUM_/ } @$list ], | 
| 44 | 6283 |  |  |  |  | 8367 | set    => [ grep { /^SET_/ } @$list ], | 
| 45 | 6283 |  |  |  |  | 8919 | string => [ grep { /^STRING_/ } @$list ], | 
| 46 | 6283 |  |  |  |  | 8645 | ); | 
| 47 | 139 |  |  |  |  | 1383 | } | 
|  | 6283 |  |  |  |  | 8814 |  | 
| 48 |  |  |  |  |  |  |  | 
| 49 |  |  |  |  |  |  | { | 
| 50 |  |  |  |  |  |  | my($class) = shift; | 
| 51 |  |  |  |  |  |  |  | 
| 52 |  |  |  |  |  |  | $class->use_private_messages; | 
| 53 | 332 |  |  | 332 |  | 66711 | $class->init_export_tags; | 
| 54 |  |  |  |  |  |  |  | 
| 55 | 332 |  |  |  |  | 1082 | if($Rose::HTML::Object::Exporter::Target_Class) | 
| 56 | 332 |  |  |  |  | 1174 | { | 
| 57 |  |  |  |  |  |  | $class->SUPER::import(@_); | 
| 58 | 332 | 100 |  |  |  | 17415 | } | 
| 59 |  |  |  |  |  |  | else | 
| 60 | 3 |  |  |  |  | 14 | { | 
| 61 |  |  |  |  |  |  | local $Rose::HTML::Object::Exporter::Target_Class = (caller)[0]; | 
| 62 |  |  |  |  |  |  | $class->SUPER::import(@_); | 
| 63 |  |  |  |  |  |  | } | 
| 64 | 329 |  |  |  |  | 1034 | } | 
| 65 | 329 |  |  |  |  | 1457 |  | 
| 66 |  |  |  |  |  |  | our %Private; | 
| 67 |  |  |  |  |  |  |  | 
| 68 |  |  |  |  |  |  | { | 
| 69 |  |  |  |  |  |  | my($class) = shift; | 
| 70 |  |  |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | unless($Private{$class}) | 
| 72 |  |  |  |  |  |  | { | 
| 73 | 4221 |  |  | 4221 | 0 | 5711 | $Private{$class} = 1; | 
| 74 |  |  |  |  |  |  |  | 
| 75 | 4221 | 100 |  |  |  | 9042 | # Make private copies of inherited data structures | 
| 76 |  |  |  |  |  |  | # (shallow copy is sufficient) | 
| 77 | 107 |  |  |  |  | 212 | $class->message_names([ $class->message_names ]); | 
| 78 |  |  |  |  |  |  | $class->message_id_to_name_map({ %{$class->message_id_to_name_map} }); | 
| 79 |  |  |  |  |  |  | $class->message_name_to_id_map({ %{$class->message_name_to_id_map} }); | 
| 80 |  |  |  |  |  |  | } | 
| 81 | 107 |  |  |  |  | 302 | } | 
| 82 | 107 |  |  |  |  | 618 |  | 
|  | 107 |  |  |  |  | 327 |  | 
| 83 | 107 |  |  |  |  | 1776 |  | 
|  | 107 |  |  |  |  | 281 |  | 
| 84 |  |  |  |  |  |  | { | 
| 85 |  |  |  |  |  |  | my($class) = shift; | 
| 86 |  |  |  |  |  |  |  | 
| 87 | 69 |  |  | 69 | 1 | 2497 | $class->_message_names(@_)  if(@_); | 
| 88 | 4 |  |  | 4 | 1 | 1377 |  | 
| 89 |  |  |  |  |  |  | wantarray ? @{$class->_message_names} : | 
| 90 |  |  |  |  |  |  | $class->_message_names; | 
| 91 |  |  |  |  |  |  | } | 
| 92 | 593 |  |  | 593 | 1 | 3372 |  | 
| 93 |  |  |  |  |  |  | { | 
| 94 | 593 | 100 |  |  |  | 1705 | my($class, $symbol) = @_; | 
| 95 |  |  |  |  |  |  | no strict 'refs'; | 
| 96 | 593 | 100 |  |  |  | 2607 | my $const = "${class}::$symbol"; | 
|  | 109 |  |  |  |  | 375 |  | 
| 97 |  |  |  |  |  |  | return &$const  if(defined &$const); | 
| 98 |  |  |  |  |  |  | return undef; | 
| 99 |  |  |  |  |  |  | } | 
| 100 |  |  |  |  |  |  |  | 
| 101 |  |  |  |  |  |  | { | 
| 102 | 113 |  |  | 113 | 1 | 1557 | my($class) = shift; | 
| 103 | 47 |  |  | 47 |  | 25890 | my $map = $class->message_id_to_name_map; | 
|  | 47 |  |  |  |  | 106 |  | 
|  | 47 |  |  |  |  | 6847 |  | 
| 104 | 113 |  |  |  |  | 286 |  | 
| 105 | 113 | 100 |  |  |  | 1069 | return wantarray ? | 
| 106 | 2 |  |  |  |  | 9 | (sort { $a <=> $b } keys %$map) : | 
| 107 |  |  |  |  |  |  | [ sort { $a <=> $b } keys %$map ]; | 
| 108 |  |  |  |  |  |  | } | 
| 109 |  |  |  |  |  |  |  | 
| 110 |  |  |  |  |  |  | { | 
| 111 | 6 |  |  | 6 | 1 | 8857 | no warnings 'uninitialized'; | 
| 112 | 6 |  |  |  |  | 25 | return $_[0]->message_id_to_name_map->{$_[1]}; | 
| 113 |  |  |  |  |  |  | } | 
| 114 |  |  |  |  |  |  |  | 
| 115 | 595 |  |  |  |  | 646 | { | 
| 116 | 6 | 100 |  |  |  | 105 | my($class, $name, $id) = @_; | 
|  | 287 |  |  |  |  | 325 |  | 
| 117 |  |  |  |  |  |  |  | 
| 118 |  |  |  |  |  |  | $class->use_private_messages; | 
| 119 |  |  |  |  |  |  |  | 
| 120 |  |  |  |  |  |  | unless($class->imported($name)) | 
| 121 | 47 |  |  | 47 |  | 328 | { | 
|  | 47 |  |  |  |  | 102 |  | 
|  | 47 |  |  |  |  | 8392 |  | 
| 122 | 471 |  |  | 471 | 1 | 4630 | if(exists $class->message_name_to_id_map->{$name} && | 
| 123 |  |  |  |  |  |  | $class->message_name_to_id_map->{$name} != $id) | 
| 124 |  |  |  |  |  |  | { | 
| 125 |  |  |  |  |  |  | croak "Could not add message '$name' - a message with that name already exists ", | 
| 126 |  |  |  |  |  |  | '(', $class->message_name_to_id_map->{$name}, ')'; | 
| 127 | 3780 |  |  | 3780 | 1 | 7156 | } | 
| 128 |  |  |  |  |  |  |  | 
| 129 | 3780 |  |  |  |  | 7184 | if(exists $class->message_id_to_name_map->{$id} && | 
| 130 |  |  |  |  |  |  | $class->message_id_to_name_map->{$id} ne $name) | 
| 131 | 3780 | 100 |  |  |  | 7717 | { | 
| 132 |  |  |  |  |  |  | croak "Could not add message '$name' - a message with the id $id already exists ", | 
| 133 | 3282 | 50 | 33 |  |  | 5975 | '(', $class->message_id_to_name_map->{$id}, ')'; | 
| 134 |  |  |  |  |  |  | } | 
| 135 |  |  |  |  |  |  | } | 
| 136 |  |  |  |  |  |  |  | 
| 137 | 0 |  |  |  |  | 0 | MAKE_CONSTANT: | 
| 138 |  |  |  |  |  |  | { | 
| 139 |  |  |  |  |  |  | no strict 'refs'; | 
| 140 | 3282 | 100 | 66 |  |  | 22499 | my $const = "${class}::$name"; | 
| 141 |  |  |  |  |  |  | unless($class->can($name) || defined &$const) | 
| 142 |  |  |  |  |  |  | { | 
| 143 |  |  |  |  |  |  | *{"${class}::$name"} = sub() { $id }; | 
| 144 | 2 |  |  |  |  | 32 |  | 
| 145 |  |  |  |  |  |  | #my $error; | 
| 146 |  |  |  |  |  |  | # | 
| 147 |  |  |  |  |  |  | #TRY: | 
| 148 |  |  |  |  |  |  | #{ | 
| 149 |  |  |  |  |  |  | #  local $@; | 
| 150 | 47 |  |  | 47 |  | 359 | #  eval "package $class; use constant $name => $id;"; | 
|  | 47 |  |  |  |  | 85 |  | 
|  | 47 |  |  |  |  | 7783 |  | 
|  | 3778 |  |  |  |  | 22294 |  | 
| 151 | 3778 |  |  |  |  | 6094 | #  $error = $@; | 
| 152 | 3778 | 100 | 66 |  |  | 12179 | #} | 
| 153 |  |  |  |  |  |  | # | 
| 154 | 19 |  |  | 0 |  | 172 | #croak "Could not create constant '$name' in $class - $error"  if($error); | 
|  | 19 |  |  |  |  | 108 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 155 |  |  |  |  |  |  | } | 
| 156 |  |  |  |  |  |  | } | 
| 157 |  |  |  |  |  |  |  | 
| 158 |  |  |  |  |  |  | unless(exists $class->message_name_to_id_map->{$name}) | 
| 159 |  |  |  |  |  |  | { | 
| 160 |  |  |  |  |  |  | push(@{$class->_message_names}, $name); | 
| 161 |  |  |  |  |  |  | } | 
| 162 |  |  |  |  |  |  |  | 
| 163 |  |  |  |  |  |  | $class->message_id_to_name_map->{$id}   = $name; | 
| 164 |  |  |  |  |  |  | $class->message_name_to_id_map->{$name} = $id; | 
| 165 |  |  |  |  |  |  |  | 
| 166 |  |  |  |  |  |  | return; | 
| 167 |  |  |  |  |  |  | } | 
| 168 |  |  |  |  |  |  |  | 
| 169 | 3778 | 100 |  |  |  | 6848 | { | 
| 170 |  |  |  |  |  |  | my($class) = shift; | 
| 171 | 3280 |  |  |  |  | 18377 |  | 
|  | 3280 |  |  |  |  | 5672 |  | 
| 172 |  |  |  |  |  |  | $class->use_private_messages; | 
| 173 |  |  |  |  |  |  |  | 
| 174 | 3778 |  |  |  |  | 23797 | no strict 'refs'; | 
| 175 | 3778 |  |  |  |  | 23373 |  | 
| 176 |  |  |  |  |  |  | if(@_) | 
| 177 | 3778 |  |  |  |  | 23978 | { | 
| 178 |  |  |  |  |  |  | foreach my $name (@_) | 
| 179 |  |  |  |  |  |  | { | 
| 180 |  |  |  |  |  |  | $class->add_message($name, "${class}::$name"->()); | 
| 181 |  |  |  |  |  |  | } | 
| 182 | 109 |  |  | 109 | 1 | 3775 | } | 
| 183 |  |  |  |  |  |  | else | 
| 184 | 109 |  |  |  |  | 587 | { | 
| 185 |  |  |  |  |  |  | foreach my $name (keys %{"${class}::"}) | 
| 186 | 47 |  |  | 47 |  | 453 | { | 
|  | 47 |  |  |  |  | 127 |  | 
|  | 47 |  |  |  |  | 12231 |  | 
| 187 |  |  |  |  |  |  | my $fq_name = "${class}::$name"; | 
| 188 | 109 | 100 |  |  |  | 1728 |  | 
| 189 |  |  |  |  |  |  | next  unless(defined *{$fq_name}{'CODE'} && $name =~ /^[A-Z0-9_]+$/); | 
| 190 | 2 |  |  |  |  | 4 |  | 
| 191 |  |  |  |  |  |  | my $code = $class->can($name); | 
| 192 | 4 |  |  |  |  | 23 |  | 
| 193 |  |  |  |  |  |  | # Skip it if it's not a constant | 
| 194 |  |  |  |  |  |  | next  unless(defined prototype($code) && !length(prototype($code))); | 
| 195 |  |  |  |  |  |  |  | 
| 196 |  |  |  |  |  |  | # Should not need this check? | 
| 197 | 107 |  |  |  |  | 166 | next  if($name =~ /^(BEGIN|DESTROY|AUTOLOAD|TIE.*)$/); | 
|  | 107 |  |  |  |  | 1385 |  | 
| 198 |  |  |  |  |  |  |  | 
| 199 | 6111 |  |  |  |  | 10127 | $Debug && warn "$class ADD $name = ", $code->(), "\n"; | 
| 200 |  |  |  |  |  |  | $class->add_message($name, $code->()); | 
| 201 | 6111 | 100 | 100 |  |  | 6614 | } | 
|  | 6111 |  |  |  |  | 43515 |  | 
| 202 |  |  |  |  |  |  | } | 
| 203 | 3755 |  |  |  |  | 11585 | } | 
| 204 |  |  |  |  |  |  |  | 
| 205 |  |  |  |  |  |  | # | 
| 206 | 3755 | 50 | 33 |  |  | 12522 | # Messages | 
| 207 |  |  |  |  |  |  | # | 
| 208 |  |  |  |  |  |  |  | 
| 209 | 3755 | 50 |  |  |  | 9567 | use constant CUSTOM_MESSAGE => -1; | 
| 210 |  |  |  |  |  |  |  | 
| 211 | 3755 | 50 |  |  |  | 5686 | # Fields and labels | 
| 212 | 3755 |  |  |  |  | 6846 | use constant FIELD_LABEL              => 1; | 
| 213 |  |  |  |  |  |  | use constant FIELD_DESCRIPTION        => 2; | 
| 214 |  |  |  |  |  |  | use constant FIELD_REQUIRED_GENERIC   => 4; | 
| 215 |  |  |  |  |  |  | use constant FIELD_REQUIRED_LABELLED  => 5; | 
| 216 |  |  |  |  |  |  | use constant FIELD_REQUIRED_SUBFIELD  => 6; | 
| 217 |  |  |  |  |  |  | use constant FIELD_REQUIRED_SUBFIELDS => 7; | 
| 218 |  |  |  |  |  |  | use constant FIELD_PARTIAL_VALUE      => 8; | 
| 219 |  |  |  |  |  |  | use constant FIELD_INVALID_GENERIC    => 10; | 
| 220 |  |  |  |  |  |  | use constant FIELD_INVALID_LABELLED   => 11; | 
| 221 | 47 |  |  | 47 |  | 320 |  | 
|  | 47 |  |  |  |  | 199 |  | 
|  | 47 |  |  |  |  | 3067 |  | 
| 222 |  |  |  |  |  |  | use constant FIELD_LABEL_YEAR   => 10_000; | 
| 223 |  |  |  |  |  |  | use constant FIELD_LABEL_MONTH  => 10_001; | 
| 224 | 47 |  |  | 47 |  | 272 | use constant FIELD_LABEL_DAY    => 10_002; | 
|  | 47 |  |  |  |  | 89 |  | 
|  | 47 |  |  |  |  | 2602 |  | 
| 225 | 47 |  |  | 47 |  | 295 | use constant FIELD_LABEL_HOUR   => 10_003; | 
|  | 47 |  |  |  |  | 124 |  | 
|  | 47 |  |  |  |  | 2196 |  | 
| 226 | 47 |  |  | 47 |  | 262 | use constant FIELD_LABEL_MINUTE => 10_004; | 
|  | 47 |  |  |  |  | 162 |  | 
|  | 47 |  |  |  |  | 2360 |  | 
| 227 | 47 |  |  | 47 |  | 244 | use constant FIELD_LABEL_SECOND => 10_005; | 
|  | 47 |  |  |  |  | 89 |  | 
|  | 47 |  |  |  |  | 2272 |  | 
| 228 | 47 |  |  | 47 |  | 289 |  | 
|  | 47 |  |  |  |  | 83 |  | 
|  | 47 |  |  |  |  | 2176 |  | 
| 229 | 47 |  |  | 47 |  | 258 | use constant FIELD_ERROR_LABEL_YEAR   => 11_000; | 
|  | 47 |  |  |  |  | 76 |  | 
|  | 47 |  |  |  |  | 2431 |  | 
| 230 | 47 |  |  | 47 |  | 281 | use constant FIELD_ERROR_LABEL_MONTH  => 11_001; | 
|  | 47 |  |  |  |  | 139 |  | 
|  | 47 |  |  |  |  | 1963 |  | 
| 231 | 47 |  |  | 47 |  | 252 | use constant FIELD_ERROR_LABEL_DAY    => 11_002; | 
|  | 47 |  |  |  |  | 109 |  | 
|  | 47 |  |  |  |  | 2018 |  | 
| 232 | 47 |  |  | 47 |  | 254 | use constant FIELD_ERROR_LABEL_HOUR   => 11_003; | 
|  | 47 |  |  |  |  | 87 |  | 
|  | 47 |  |  |  |  | 2054 |  | 
| 233 |  |  |  |  |  |  | use constant FIELD_ERROR_LABEL_MINUTE => 11_004; | 
| 234 | 47 |  |  | 47 |  | 250 | use constant FIELD_ERROR_LABEL_SECOND => 11_005; | 
|  | 47 |  |  |  |  | 77 |  | 
|  | 47 |  |  |  |  | 2088 |  | 
| 235 | 47 |  |  | 47 |  | 310 |  | 
|  | 47 |  |  |  |  | 76 |  | 
|  | 47 |  |  |  |  | 2137 |  | 
| 236 | 47 |  |  | 47 |  | 276 | use constant FIELD_ERROR_LABEL_MINIMUM_DATE => 11_006; | 
|  | 47 |  |  |  |  | 230 |  | 
|  | 47 |  |  |  |  | 2189 |  | 
| 237 | 47 |  |  | 47 |  | 238 | use constant FIELD_ERROR_LABEL_MAXIMUM_DATE => 11_007; | 
|  | 47 |  |  |  |  | 297 |  | 
|  | 47 |  |  |  |  | 1958 |  | 
| 238 | 47 |  |  | 47 |  | 247 |  | 
|  | 47 |  |  |  |  | 101 |  | 
|  | 47 |  |  |  |  | 2039 |  | 
| 239 | 47 |  |  | 47 |  | 272 | # Forms | 
|  | 47 |  |  |  |  | 123 |  | 
|  | 47 |  |  |  |  | 1906 |  | 
| 240 |  |  |  |  |  |  | use constant FORM_HAS_ERRORS => 100; | 
| 241 | 47 |  |  | 47 |  | 298 |  | 
|  | 47 |  |  |  |  | 122 |  | 
|  | 47 |  |  |  |  | 1994 |  | 
| 242 | 47 |  |  | 47 |  | 248 | # Numerical messages | 
|  | 47 |  |  |  |  | 87 |  | 
|  | 47 |  |  |  |  | 1975 |  | 
| 243 | 47 |  |  | 47 |  | 241 | use constant NUM_INVALID_INTEGER          => 1300; | 
|  | 47 |  |  |  |  | 95 |  | 
|  | 47 |  |  |  |  | 2016 |  | 
| 244 | 47 |  |  | 47 |  | 253 | use constant NUM_INVALID_INTEGER_POSITIVE => 1301; | 
|  | 47 |  |  |  |  | 105 |  | 
|  | 47 |  |  |  |  | 2105 |  | 
| 245 | 47 |  |  | 47 |  | 254 | use constant NUM_NOT_POSITIVE_INTEGER     => 1302; | 
|  | 47 |  |  |  |  | 134 |  | 
|  | 47 |  |  |  |  | 2033 |  | 
| 246 | 47 |  |  | 47 |  | 239 | use constant NUM_BELOW_MIN                => 1303; | 
|  | 47 |  |  |  |  | 92 |  | 
|  | 47 |  |  |  |  | 2047 |  | 
| 247 |  |  |  |  |  |  | use constant NUM_ABOVE_MAX                => 1304; | 
| 248 | 47 |  |  | 47 |  | 310 | use constant NUM_INVALID_NUMBER           => 1305; | 
|  | 47 |  |  |  |  | 83 |  | 
|  | 47 |  |  |  |  | 2143 |  | 
| 249 | 47 |  |  | 47 |  | 253 | use constant NUM_INVALID_NUMBER_POSITIVE  => 1306; | 
|  | 47 |  |  |  |  | 78 |  | 
|  | 47 |  |  |  |  | 2078 |  | 
| 250 |  |  |  |  |  |  | use constant NUM_NOT_POSITIVE_NUMBER      => 1307; | 
| 251 |  |  |  |  |  |  |  | 
| 252 | 47 |  |  | 47 |  | 244 | # String messages | 
|  | 47 |  |  |  |  | 77 |  | 
|  | 47 |  |  |  |  | 2047 |  | 
| 253 |  |  |  |  |  |  | use constant STRING_OVERFLOW => 1400; | 
| 254 |  |  |  |  |  |  |  | 
| 255 | 47 |  |  | 47 |  | 253 | # Date messages | 
|  | 47 |  |  |  |  | 91 |  | 
|  | 47 |  |  |  |  | 1905 |  | 
| 256 | 47 |  |  | 47 |  | 233 | use constant DATE_INVALID              => 1500; | 
|  | 47 |  |  |  |  | 108 |  | 
|  | 47 |  |  |  |  | 1919 |  | 
| 257 | 47 |  |  | 47 |  | 236 | use constant DATE_MIN_GREATER_THAN_MAX => 1501; | 
|  | 47 |  |  |  |  | 106 |  | 
|  | 47 |  |  |  |  | 2159 |  | 
| 258 | 47 |  |  | 47 |  | 251 |  | 
|  | 47 |  |  |  |  | 75 |  | 
|  | 47 |  |  |  |  | 2078 |  | 
| 259 | 47 |  |  | 47 |  | 233 | # Time messages | 
|  | 47 |  |  |  |  | 243 |  | 
|  | 47 |  |  |  |  | 2037 |  | 
| 260 | 47 |  |  | 47 |  | 244 | use constant TIME_INVALID         => 1550; | 
|  | 47 |  |  |  |  | 83 |  | 
|  | 47 |  |  |  |  | 2044 |  | 
| 261 | 47 |  |  | 47 |  | 249 | use constant TIME_INVALID_HOUR    => 1551; | 
|  | 47 |  |  |  |  | 107 |  | 
|  | 47 |  |  |  |  | 1975 |  | 
| 262 | 47 |  |  | 47 |  | 244 | use constant TIME_INVALID_MINUTE  => 1552; | 
|  | 47 |  |  |  |  | 274 |  | 
|  | 47 |  |  |  |  | 2356 |  | 
| 263 |  |  |  |  |  |  | use constant TIME_INVALID_SECONDS => 1553; | 
| 264 |  |  |  |  |  |  | use constant TIME_INVALID_AMPM    => 1554; | 
| 265 | 47 |  |  | 47 |  | 285 |  | 
|  | 47 |  |  |  |  | 106 |  | 
|  | 47 |  |  |  |  | 2029 |  | 
| 266 |  |  |  |  |  |  | # Email messages | 
| 267 |  |  |  |  |  |  | use constant EMAIL_INVALID => 1600; | 
| 268 | 47 |  |  | 47 |  | 314 |  | 
|  | 47 |  |  |  |  | 186 |  | 
|  | 47 |  |  |  |  | 1911 |  | 
| 269 | 47 |  |  | 47 |  | 240 | # Phone messages | 
|  | 47 |  |  |  |  | 108 |  | 
|  | 47 |  |  |  |  | 2175 |  | 
| 270 |  |  |  |  |  |  | use constant PHONE_INVALID => 1650; | 
| 271 |  |  |  |  |  |  |  | 
| 272 | 47 |  |  | 47 |  | 248 | # Set messages | 
|  | 47 |  |  |  |  | 78 |  | 
|  | 47 |  |  |  |  | 2129 |  | 
| 273 | 47 |  |  | 47 |  | 243 | use constant SET_INVALID_QUOTED_STRING => 1700; | 
|  | 47 |  |  |  |  | 146 |  | 
|  | 47 |  |  |  |  | 1843 |  | 
| 274 | 47 |  |  | 47 |  | 256 | use constant SET_PARSE_ERROR           => 1701; | 
|  | 47 |  |  |  |  | 104 |  | 
|  | 47 |  |  |  |  | 2092 |  | 
| 275 | 47 |  |  | 47 |  | 256 |  | 
|  | 47 |  |  |  |  | 100 |  | 
|  | 47 |  |  |  |  | 1954 |  | 
| 276 | 47 |  |  | 47 |  | 412 | BEGIN { __PACKAGE__->add_messages } | 
|  | 47 |  |  |  |  | 119 |  | 
|  | 47 |  |  |  |  | 2138 |  | 
| 277 |  |  |  |  |  |  |  | 
| 278 |  |  |  |  |  |  | 1; | 
| 279 | 47 |  |  | 47 |  | 265 |  | 
|  | 47 |  |  |  |  | 88 |  | 
|  | 47 |  |  |  |  | 2065 |  | 
| 280 |  |  |  |  |  |  |  | 
| 281 |  |  |  |  |  |  | =head1 NAME | 
| 282 | 47 |  |  | 47 |  | 252 |  | 
|  | 47 |  |  |  |  | 92 |  | 
|  | 47 |  |  |  |  | 1850 |  | 
| 283 |  |  |  |  |  |  | Rose::HTML::Object::Messages - Message ids and named constants for use with HTML objects. | 
| 284 |  |  |  |  |  |  |  | 
| 285 | 47 |  |  | 47 |  | 397 | =head1 SYNOPSIS | 
|  | 47 |  |  |  |  | 111 |  | 
|  | 47 |  |  |  |  | 1999 |  | 
| 286 | 47 |  |  | 47 |  | 241 |  | 
|  | 47 |  |  |  |  | 86 |  | 
|  | 47 |  |  |  |  | 2206 |  | 
| 287 |  |  |  |  |  |  | package My::HTML::Object::Messages; | 
| 288 | 47 |  |  | 47 |  | 193 |  | 
| 289 |  |  |  |  |  |  | use strict; | 
| 290 |  |  |  |  |  |  |  | 
| 291 |  |  |  |  |  |  | # Import the standard set of message ids | 
| 292 |  |  |  |  |  |  | use Rose::HTML::Object::Messages qw(:all); | 
| 293 |  |  |  |  |  |  | use base qw(Rose::HTML::Object::Messages); | 
| 294 |  |  |  |  |  |  |  | 
| 295 |  |  |  |  |  |  | ## | 
| 296 |  |  |  |  |  |  | ## Define your new message ids below | 
| 297 |  |  |  |  |  |  | ## | 
| 298 |  |  |  |  |  |  |  | 
| 299 |  |  |  |  |  |  | # Message ids from 0 to 29,999 are reserved for built-in messages. | 
| 300 |  |  |  |  |  |  | # Negative message ids are reserved for internal use.  Please use | 
| 301 |  |  |  |  |  |  | # message ids 30,000 or higher for your messages.  Suggested message | 
| 302 |  |  |  |  |  |  | # id ranges and naming conventions for various message types are | 
| 303 |  |  |  |  |  |  | # shown below. | 
| 304 |  |  |  |  |  |  |  | 
| 305 |  |  |  |  |  |  | # Field labels | 
| 306 |  |  |  |  |  |  |  | 
| 307 |  |  |  |  |  |  | use constant FIELD_LABEL_LOGIN_NAME         => 100_000; | 
| 308 |  |  |  |  |  |  | use constant FIELD_LABEL_PASSWORD           => 100_001; | 
| 309 |  |  |  |  |  |  | ... | 
| 310 |  |  |  |  |  |  |  | 
| 311 |  |  |  |  |  |  | # Field error messages | 
| 312 |  |  |  |  |  |  |  | 
| 313 |  |  |  |  |  |  | use constant FIELD_ERROR_PASSWORD_TOO_SHORT => 101_000; | 
| 314 |  |  |  |  |  |  | use constant FIELD_ERROR_USERNAME_INVALID   => 101_001; | 
| 315 |  |  |  |  |  |  | ... | 
| 316 |  |  |  |  |  |  |  | 
| 317 |  |  |  |  |  |  | # Generic messages | 
| 318 |  |  |  |  |  |  |  | 
| 319 |  |  |  |  |  |  | use constant LOGIN_NO_SUCH_USER             => 200_000; | 
| 320 |  |  |  |  |  |  | use constant LOGIN_USER_EXISTS_ERROR        => 200_001; | 
| 321 |  |  |  |  |  |  | ... | 
| 322 |  |  |  |  |  |  |  | 
| 323 |  |  |  |  |  |  | # This line must be below all the "use constant ..." declarations | 
| 324 |  |  |  |  |  |  | BEGIN { __PACKAGE__->add_messages } | 
| 325 |  |  |  |  |  |  |  | 
| 326 |  |  |  |  |  |  | 1; | 
| 327 |  |  |  |  |  |  |  | 
| 328 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 329 |  |  |  |  |  |  |  | 
| 330 |  |  |  |  |  |  | L<Rose::HTML::Object::Messages> stores message ids and names.  The message ids are defined as Perl L<constants|constant> with integer values.  The constants themselves as well as the mapping between the symbolic constant names and their values are stored as class data. | 
| 331 |  |  |  |  |  |  |  | 
| 332 |  |  |  |  |  |  | If you merely want to import one of the standard message id constants, you may use this module as-is (see the L<EXPORTS|/EXPORTS> section for details).  If you want to define your own messages, you must subclass this module exactly as shown in the synopsis.  The order of the statements is important! | 
| 333 |  |  |  |  |  |  |  | 
| 334 |  |  |  |  |  |  | When adding your own messages, you are free to choose any integer message id values, subject to the following constraints: | 
| 335 |  |  |  |  |  |  |  | 
| 336 |  |  |  |  |  |  | =over 4 | 
| 337 |  |  |  |  |  |  |  | 
| 338 |  |  |  |  |  |  | =item * Message ids from 0 to 29,999 are reserved for built-in messages. | 
| 339 |  |  |  |  |  |  |  | 
| 340 |  |  |  |  |  |  | =item * Negative message ids are reserved for internal use. | 
| 341 |  |  |  |  |  |  |  | 
| 342 |  |  |  |  |  |  | =back | 
| 343 |  |  |  |  |  |  |  | 
| 344 |  |  |  |  |  |  | Please use ids 30,000 or higher for your messages.  Constant names may contain only the characters C<[A-Z0-9_]> and must be unique among all message constant names. | 
| 345 |  |  |  |  |  |  |  | 
| 346 |  |  |  |  |  |  | =head1 EXPORTS | 
| 347 |  |  |  |  |  |  |  | 
| 348 |  |  |  |  |  |  | L<Rose::HTML::Object::Messages> does not export any symbols by default. | 
| 349 |  |  |  |  |  |  |  | 
| 350 |  |  |  |  |  |  | The 'all' tag: | 
| 351 |  |  |  |  |  |  |  | 
| 352 |  |  |  |  |  |  | use Rose::HTML::Object::Messages qw(:all); | 
| 353 |  |  |  |  |  |  |  | 
| 354 |  |  |  |  |  |  | will cause all message name constant to be imported. | 
| 355 |  |  |  |  |  |  |  | 
| 356 |  |  |  |  |  |  | The following tags will cause all messages whose names match the regular expression to the right of the tag name to be imported. | 
| 357 |  |  |  |  |  |  |  | 
| 358 |  |  |  |  |  |  | TAG       NAME REGEX | 
| 359 |  |  |  |  |  |  | -----     ----------------- | 
| 360 |  |  |  |  |  |  | field     ^FIELD_ | 
| 361 |  |  |  |  |  |  | form      ^FORM_ | 
| 362 |  |  |  |  |  |  | date      ^DATE_|_(?:YEAR|MONTH|DAY)$ | 
| 363 |  |  |  |  |  |  | time      ^TIME_|_(?:HOUR|MINUTE|SECOND)$ | 
| 364 |  |  |  |  |  |  | email     ^EMAIL_ | 
| 365 |  |  |  |  |  |  | phone     ^PHONE_ | 
| 366 |  |  |  |  |  |  | number    ^NUM_ | 
| 367 |  |  |  |  |  |  | set       ^SET_ | 
| 368 |  |  |  |  |  |  | string    ^STRING_ | 
| 369 |  |  |  |  |  |  |  | 
| 370 |  |  |  |  |  |  | For example, this will import all the message constants whose names begin with "FIELD_" | 
| 371 |  |  |  |  |  |  |  | 
| 372 |  |  |  |  |  |  | use Rose::HTML::Object::Messages qw(:field); | 
| 373 |  |  |  |  |  |  |  | 
| 374 |  |  |  |  |  |  | Finally, you can import individual message constant names as well: | 
| 375 |  |  |  |  |  |  |  | 
| 376 |  |  |  |  |  |  | use Rose::HTML::Object::Messages qw(FIELD_LABEL_YEAR TIME_INVALID); | 
| 377 |  |  |  |  |  |  |  | 
| 378 |  |  |  |  |  |  | A complete listing of the default set of message constant names appears in the next section. | 
| 379 |  |  |  |  |  |  |  | 
| 380 |  |  |  |  |  |  | =head1 BUILT-IN MESSAGES | 
| 381 |  |  |  |  |  |  |  | 
| 382 |  |  |  |  |  |  | The list of built-in messages constant names appears below.  You should not rely on the actual numeric values of these constants.  Import and refer to them only by their symbolic names. | 
| 383 |  |  |  |  |  |  |  | 
| 384 |  |  |  |  |  |  | FIELD_LABEL | 
| 385 |  |  |  |  |  |  | FIELD_DESCRIPTION | 
| 386 |  |  |  |  |  |  | FIELD_REQUIRED_GENERIC | 
| 387 |  |  |  |  |  |  | FIELD_REQUIRED_LABELLED | 
| 388 |  |  |  |  |  |  | FIELD_REQUIRED_SUBFIELD | 
| 389 |  |  |  |  |  |  | FIELD_REQUIRED_SUBFIELDS | 
| 390 |  |  |  |  |  |  | FIELD_PARTIAL_VALUE | 
| 391 |  |  |  |  |  |  | FIELD_INVALID_GENERIC | 
| 392 |  |  |  |  |  |  | FIELD_INVALID_LABELLED | 
| 393 |  |  |  |  |  |  |  | 
| 394 |  |  |  |  |  |  | FIELD_LABEL_YEAR | 
| 395 |  |  |  |  |  |  | FIELD_LABEL_MONTH | 
| 396 |  |  |  |  |  |  | FIELD_LABEL_DAY | 
| 397 |  |  |  |  |  |  | FIELD_LABEL_HOUR | 
| 398 |  |  |  |  |  |  | FIELD_LABEL_MINUTE | 
| 399 |  |  |  |  |  |  | FIELD_LABEL_SECOND | 
| 400 |  |  |  |  |  |  |  | 
| 401 |  |  |  |  |  |  | FIELD_ERROR_LABEL_YEAR | 
| 402 |  |  |  |  |  |  | FIELD_ERROR_LABEL_MONTH | 
| 403 |  |  |  |  |  |  | FIELD_ERROR_LABEL_DAY | 
| 404 |  |  |  |  |  |  | FIELD_ERROR_LABEL_HOUR | 
| 405 |  |  |  |  |  |  | FIELD_ERROR_LABEL_MINUTE | 
| 406 |  |  |  |  |  |  | FIELD_ERROR_LABEL_SECOND | 
| 407 |  |  |  |  |  |  |  | 
| 408 |  |  |  |  |  |  | FIELD_ERROR_LABEL_MINIMUM_DATE | 
| 409 |  |  |  |  |  |  | FIELD_ERROR_LABEL_MAXIMUM_DATE | 
| 410 |  |  |  |  |  |  |  | 
| 411 |  |  |  |  |  |  | FORM_HAS_ERRORS | 
| 412 |  |  |  |  |  |  |  | 
| 413 |  |  |  |  |  |  | NUM_INVALID_INTEGER | 
| 414 |  |  |  |  |  |  | NUM_INVALID_INTEGER_POSITIVE | 
| 415 |  |  |  |  |  |  | NUM_NOT_POSITIVE_INTEGER | 
| 416 |  |  |  |  |  |  | NUM_BELOW_MIN | 
| 417 |  |  |  |  |  |  | NUM_ABOVE_MAX | 
| 418 |  |  |  |  |  |  | NUM_INVALID_NUMBER | 
| 419 |  |  |  |  |  |  | NUM_INVALID_NUMBER_POSITIVE | 
| 420 |  |  |  |  |  |  | NUM_NOT_POSITIVE_NUMBER | 
| 421 |  |  |  |  |  |  |  | 
| 422 |  |  |  |  |  |  | STRING_OVERFLOW | 
| 423 |  |  |  |  |  |  |  | 
| 424 |  |  |  |  |  |  | DATE_INVALID | 
| 425 |  |  |  |  |  |  | DATE_MIN_GREATER_THAN_MAX | 
| 426 |  |  |  |  |  |  |  | 
| 427 |  |  |  |  |  |  | TIME_INVALID | 
| 428 |  |  |  |  |  |  | TIME_INVALID_HOUR | 
| 429 |  |  |  |  |  |  | TIME_INVALID_MINUTE | 
| 430 |  |  |  |  |  |  | TIME_INVALID_SECONDS | 
| 431 |  |  |  |  |  |  | TIME_INVALID_AMPM | 
| 432 |  |  |  |  |  |  |  | 
| 433 |  |  |  |  |  |  | EMAIL_INVALID | 
| 434 |  |  |  |  |  |  |  | 
| 435 |  |  |  |  |  |  | PHONE_INVALID | 
| 436 |  |  |  |  |  |  |  | 
| 437 |  |  |  |  |  |  | SET_INVALID_QUOTED_STRING | 
| 438 |  |  |  |  |  |  | SET_PARSE_ERROR | 
| 439 |  |  |  |  |  |  |  | 
| 440 |  |  |  |  |  |  | =head1 CLASS METHODS | 
| 441 |  |  |  |  |  |  |  | 
| 442 |  |  |  |  |  |  | =over 4 | 
| 443 |  |  |  |  |  |  |  | 
| 444 |  |  |  |  |  |  | =item B<add_message NAME, ID> | 
| 445 |  |  |  |  |  |  |  | 
| 446 |  |  |  |  |  |  | Add a new message constant with NAME and an integer ID value.  Message ids from 0 to 29,999 are reserved for built-in messages.  Negative message ids are reserved for internal use.  Please use message ids 30,000 or higher for your messages.  Constant names may contain only the characters C<[A-Z0-9_]> and must be unique among all message names. | 
| 447 |  |  |  |  |  |  |  | 
| 448 |  |  |  |  |  |  | =item B<add_messages [NAME1, NAME2, ...]> | 
| 449 |  |  |  |  |  |  |  | 
| 450 |  |  |  |  |  |  | If called with no arguments, this method L<adds|/add_message> all message L<constants|constant> defined in the calling class.  Example: | 
| 451 |  |  |  |  |  |  |  | 
| 452 |  |  |  |  |  |  | __PACKAGE__->add_messages; | 
| 453 |  |  |  |  |  |  |  | 
| 454 |  |  |  |  |  |  | If called with a list of constant names, add each named constant to the list of messages.  These L<constants|constant> must already exist in the calling class.  Example: | 
| 455 |  |  |  |  |  |  |  | 
| 456 |  |  |  |  |  |  | use constant MY_MESSAGE1 => 123456; | 
| 457 |  |  |  |  |  |  | use constant MY_MESSAGE2 => 123457; | 
| 458 |  |  |  |  |  |  | ... | 
| 459 |  |  |  |  |  |  | __PACKAGE__->add_messages('MY_MESSAGE1', 'MY_MESSAGE2'); | 
| 460 |  |  |  |  |  |  |  | 
| 461 |  |  |  |  |  |  | =item B<get_message_id NAME> | 
| 462 |  |  |  |  |  |  |  | 
| 463 |  |  |  |  |  |  | Returns the integer message id corresponding to the symbolic constant NAME, or undef if no such name exists. | 
| 464 |  |  |  |  |  |  |  | 
| 465 |  |  |  |  |  |  | =item B<get_message_name ID> | 
| 466 |  |  |  |  |  |  |  | 
| 467 |  |  |  |  |  |  | Returns the symbolic message constant name corresponding to the integer message ID, or undef if no such message ID exists. | 
| 468 |  |  |  |  |  |  |  | 
| 469 |  |  |  |  |  |  | =item B<message_id_exists ID> | 
| 470 |  |  |  |  |  |  |  | 
| 471 |  |  |  |  |  |  | Return true if the integer message ID exists, false otherwise. | 
| 472 |  |  |  |  |  |  |  | 
| 473 |  |  |  |  |  |  | =item B<message_name_exists NAME> | 
| 474 |  |  |  |  |  |  |  | 
| 475 |  |  |  |  |  |  | Return true if the symbolic message constant NAME exists, false otherwise. | 
| 476 |  |  |  |  |  |  |  | 
| 477 |  |  |  |  |  |  | =item B<message_ids> | 
| 478 |  |  |  |  |  |  |  | 
| 479 |  |  |  |  |  |  | Returns a list (in list context) or reference to an array (in scalar context) of integer message ids. | 
| 480 |  |  |  |  |  |  |  | 
| 481 |  |  |  |  |  |  | =item B<message_names> | 
| 482 |  |  |  |  |  |  |  | 
| 483 |  |  |  |  |  |  | Returns a list (in list context) or reference to an array (in scalar context) of message names. | 
| 484 |  |  |  |  |  |  |  | 
| 485 |  |  |  |  |  |  | =back | 
| 486 |  |  |  |  |  |  |  | 
| 487 |  |  |  |  |  |  | =head1 AUTHOR | 
| 488 |  |  |  |  |  |  |  | 
| 489 |  |  |  |  |  |  | John C. Siracusa (siracusa@gmail.com) | 
| 490 |  |  |  |  |  |  |  | 
| 491 |  |  |  |  |  |  | =head1 LICENSE | 
| 492 |  |  |  |  |  |  |  | 
| 493 |  |  |  |  |  |  | Copyright (c) 2010 by John C. Siracusa.  All rights reserved.  This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. |