File Coverage

blib/lib/Locale/PO.pm
Criterion Covered Total %
statement 247 297 83.1
branch 176 242 72.7
condition 8 23 34.7
subroutine 32 39 82.0
pod 27 27 100.0
total 490 628 78.0


line stmt bran cond sub pod time code
1             package Locale::PO;
2 6     6   115145 use strict;
  6         11  
  6         229  
3 6     6   28 use warnings;
  6         6  
  6         264  
4             our $VERSION = '0.25';
5              
6 6     6   34 use Carp;
  6         9  
  6         22754  
7              
8             sub new {
9 1044     1044 1 55592 my $this = shift;
10 1044         1789 my %options = @_;
11 1044   33     2809 my $class = ref($this) || $this;
12 1044         1277 my $self = {};
13 1044         2202 bless $self, $class;
14 1044         1862 $self->_flags([]);
15 1044 100       1927 $self->fuzzy_msgid($options{'-fuzzy_msgid'}) if defined($options{'-fuzzy_msgid'});
16 1044 100       1554 $self->fuzzy_msgid_plural($options{'-fuzzy_msgid_plural'})
17             if defined($options{'-fuzzy_msgid_plural'});
18 1044 100       1444 $self->msgid($options{'-msgid'}) if defined($options{'-msgid'});
19 1044 100       1483 $self->msgid_plural($options{'-msgid_plural'})
20             if defined($options{'-msgid_plural'});
21 1044 100       1728 $self->msgstr($options{'-msgstr'}) if defined($options{'-msgstr'});
22 1044 100       1562 $self->msgstr_n($options{'-msgstr_n'})
23             if defined($options{'-msgstr_n'});
24 1044 50       1544 $self->msgctxt($options{'-msgctxt'}) if defined($options{'-msgctxt'});
25 1044 50       1392 $self->fuzzy_msgctxt($options{'-fuzzy_msgctxt'})
26             if defined($options{'-fuzzy_msgctxt'});
27 1044 100       1443 $self->comment($options{'-comment'}) if defined($options{'-comment'});
28 1044 100       1356 $self->fuzzy($options{'-fuzzy'}) if defined($options{'-fuzzy'});
29 1044 50       1437 $self->automatic($options{'-automatic'})
30             if defined($options{'-automatic'});
31 1044 50       1398 $self->reference($options{'-reference'})
32             if defined($options{'-reference'});
33 1044 50       1455 $self->c_format(1) if defined($options{'-c-format'});
34 1044 50       1456 $self->c_format(1) if defined($options{'-c_format'});
35 1044 50       1525 $self->c_format(0) if defined($options{'-no-c-format'});
36 1044 50       1353 $self->c_format(0) if defined($options{'-no_c_format'});
37 1044 100       2784 $self->loaded_line_number($options{'-loaded_line_number'})
38             if defined($options{'-loaded_line_number'});
39 1044         1817 return $self;
40             }
41              
42             sub fuzzy_msgctxt {
43 1051     1051 1 825 my $self = shift;
44 1051 100       2645 @_ ? $self->{'fuzzy_msgctxt'} = $self->quote(shift) : $self->{'fuzzy_msgctxt'};
45             }
46              
47             sub fuzzy_msgid {
48 1067     1067 1 885 my $self = shift;
49 1067 100       2242 @_ ? $self->{'fuzzy_msgid'} = $self->quote(shift) : $self->{'fuzzy_msgid'};
50             }
51              
52             sub fuzzy_msgid_plural {
53 1054     1054 1 832 my $self = shift;
54             @_
55 1054 100       2282 ? $self->{'fuzzy_msgid_plural'} = $self->quote(shift)
56             : $self->{'fuzzy_msgid_plural'};
57             }
58              
59             sub msgctxt {
60 1057     1057 1 857 my $self = shift;
61 1057 100       2270 @_ ? $self->{'msgctxt'} = $self->quote(shift) : $self->{'msgctxt'};
62             }
63              
64             sub msgid {
65 2095     2095 1 2646 my $self = shift;
66 2095 100       4608 @_ ? $self->{'msgid'} = $self->quote(shift) : $self->{'msgid'};
67             }
68              
69             sub msgid_plural {
70 1065     1065 1 947 my $self = shift;
71             @_
72 1065 100       2631 ? $self->{'msgid_plural'} = $self->quote(shift)
73             : $self->{'msgid_plural'};
74             }
75              
76             sub msgstr {
77 3125     3125 1 5535 my $self = shift;
78 3125 100       7275 @_ ? $self->{'msgstr'} = $self->quote(shift) : $self->{'msgstr'};
79             }
80              
81             sub msgstr_n {
82 1057     1057 1 986 my $self = shift;
83 1057 100       1621 if (@_) {
84 8         9 my $hashref = shift;
85              
86             # check that we have a hashref.
87 8 50       29 croak 'Argument to msgstr_n must be a hashref: { n => "string n", ... }.'
88             unless ref($hashref) eq 'HASH';
89              
90             # Check that the keys are all numbers.
91 15         58 croak 'Keys to msgstr_n hashref must be numbers'
92 8 50       28 if grep {m/\D/} keys %$hashref;
93              
94             # Quote all the values in the hashref.
95 8         36 $self->{'msgstr_n'}{$_} = $self->quote($$hashref{$_}) for keys %$hashref;
96              
97             }
98              
99 1057         2048 return $self->{'msgstr_n'};
100             }
101              
102             sub comment {
103 1112     1112 1 933 my $self = shift;
104 1112 100       2974 @_ ? $self->{'comment'} = shift : $self->{'comment'};
105             }
106              
107             sub automatic {
108 1049     1049 1 867 my $self = shift;
109 1049 50       2232 @_ ? $self->{'automatic'} = shift : $self->{'automatic'};
110             }
111              
112             sub reference {
113 4126     4126 1 3440 my $self = shift;
114 4126 100       12907 @_ ? $self->{'reference'} = shift : $self->{'reference'};
115             }
116              
117             sub obsolete {
118 2108     2108 1 2246 my $self = shift;
119 2108 100       4591 @_ ? $self->{'obsolete'} = shift : $self->{'obsolete'};
120             }
121              
122             sub fuzzy {
123 1     1 1 1 my $self = shift;
124              
125 1 50       3 if (@_) {
126 1         1 my $value = shift;
127 1 50       4 $value ? $self->add_flag('fuzzy') : $self->remove_flag('fuzzy');
128             }
129              
130 1         3 return $self->has_flag('fuzzy');
131             }
132              
133             sub c_format {
134 0     0 1 0 my $self = shift;
135              
136 0         0 return $self->_tri_value_flag('c-format', @_);
137             }
138              
139             sub php_format {
140 0     0 1 0 my $self = shift;
141              
142 0         0 return $self->_tri_value_flag('php-format', @_);
143             }
144              
145             sub _flags {
146 2119     2119   1754 my $self = shift;
147 2119 100       5823 @_ ? $self->{'_flags'} = shift : $self->{'_flags'};
148             }
149              
150             sub _tri_value_flag {
151 0     0   0 my $self = shift;
152 0         0 my $flag_name = shift;
153 0 0       0 if (@_) { # set or clear the flags
154 0         0 my $value = shift;
155 0 0 0     0 if (!defined($value) || $value eq "") {
    0          
156 0         0 $self->remove_flag("$flag_name");
157 0         0 $self->remove_flag("no-$flag_name");
158 0         0 return undef;
159             }
160             elsif ($value) {
161 0         0 $self->add_flag("$flag_name");
162 0         0 $self->remove_flag("no-$flag_name");
163 0         0 return 1;
164             }
165             else {
166 0         0 $self->add_flag("no-$flag_name");
167 0         0 $self->remove_flag("$flag_name");
168 0         0 return 0;
169             }
170             }
171             else { # check the flags
172 0 0       0 return 1 if $self->has_flag("$flag_name");
173 0 0       0 return 0 if $self->has_flag("no-$flag_name");
174 0         0 return undef;
175             }
176             }
177              
178             sub add_flag {
179 25     25 1 66 my ($self, $flag_name) = @_;
180 25         23 push @{$self->_flags}, $flag_name;
  25         44  
181 25         123 return;
182             }
183              
184             sub remove_flag {
185 0     0 1 0 my ($self, $flag_name) = @_;
186 0         0 my @new_flags;
187 0         0 foreach my $flag (@{$self->_flags}) {
  0         0  
188 0 0       0 push @new_flags, $flag unless $flag eq $flag_name;
189             }
190 0         0 $self->_flags(\@new_flags);
191 0         0 return;
192             }
193              
194             sub has_flag {
195 1     1 1 1 my ($self, $flag_name) = @_;
196 1         2 foreach my $flag (@{$self->_flags}) {
  1         2  
197 1 50       3 return 1 if $flag eq $flag_name;
198             }
199 0         0 return;
200             }
201              
202             sub loaded_line_number {
203 1041     1041 1 1593 my $self = shift;
204 1041 100       1940 @_ ? $self->{'loaded_line_number'} = shift : $self->{'loaded_line_number'};
205             }
206              
207             sub _normalize_str {
208 2131     2131   1772 my $self = shift;
209 2131         1839 my $string = shift;
210 2131         2984 my $dequoted = $self->dequote($string);
211              
212             # Multiline: this isn't quite perfect, but fast and easy
213 2131 100 66     7948 if (defined $dequoted && $dequoted =~ /\n/) {
214 188         175 my $output;
215             my @lines;
216 188         623 @lines = split(/\n/, $dequoted, -1);
217 188         239 my $lastline = pop @lines; # special treatment for this one
218 188 100       384 $output = qq{""\n} if ($#lines != 0);
219 188         284 foreach (@lines) {
220 309         650 $output .= $self->quote("$_\n") . "\n";
221             }
222 188 100       388 $output .= $self->quote($lastline) . "\n" if $lastline ne "";
223 188         467 return $output;
224             }
225             # Single line
226             else {
227 1943   50     5371 return ($string || "") . "\n";
228             }
229             }
230              
231             sub _fuzzy_normalize_str {
232 13     13   8 my $self = shift;
233 13         12 my $string = shift;
234 13         7 my $prefix = shift;
235              
236 13         15 my $normalized = $self->_normalize_str($string);
237              
238             # on newlines, start them with "#| " or "#~| "
239 13         22 $normalized =~ s/\n"/\n$prefix"/g;
240              
241 13         20 return $normalized;
242             }
243              
244             sub dump {
245 1049     1049 1 6289 my $self = shift;
246 1049 100       1327 my $obsolete = $self->obsolete ? '#~ ' : '';
247 1049 100       1315 my $fuzzy_prefix = $self->obsolete ? '#~| ' : '#| ';
248 1049         772 my $dump;
249              
250 1049 100       1702 $dump = $self->_dump_multi_comment($self->comment, "# ")
251             if ($self->comment);
252 1049 50       1367 $dump .= $self->_dump_multi_comment($self->automatic, "#. ")
253             if ($self->automatic);
254 1049 100       1582 $dump .= $self->_dump_multi_comment($self->reference, "#: ")
255             if ($self->reference);
256              
257 1049         1131 my $flags = '';
258              
259 1049         866 foreach my $flag (@{$self->_flags}) {
  1049         1453  
260 29         70 $flags .= ", $flag";
261             }
262              
263 1049 100       1955 $dump .= "#$flags\n"
264             if length $flags;
265              
266 1049 100       1372 $dump
267             .= "${fuzzy_prefix}msgctxt "
268             . $self->_fuzzy_normalize_str($self->fuzzy_msgctxt, $fuzzy_prefix)
269             if $self->fuzzy_msgctxt;
270 1049 100       1368 $dump
271             .= "${fuzzy_prefix}msgid "
272             . $self->_fuzzy_normalize_str($self->fuzzy_msgid, $fuzzy_prefix)
273             if $self->fuzzy_msgid;
274 1049 100       1343 $dump
275             .= "${fuzzy_prefix}msgid_plural "
276             . $self->_fuzzy_normalize_str($self->fuzzy_msgid_plural, $fuzzy_prefix)
277             if $self->fuzzy_msgid_plural;
278              
279 1049 100       1294 $dump .= "${obsolete}msgctxt " . $self->_normalize_str($self->msgctxt)
280             if $self->msgctxt;
281 1049         1617 $dump .= "${obsolete}msgid " . $self->_normalize_str($self->msgid);
282 1049 100       1780 $dump .= "${obsolete}msgid_plural " . $self->_normalize_str($self->msgid_plural)
283             if $self->msgid_plural;
284              
285 1049 100       1480 $dump .= "${obsolete}msgstr " . $self->_normalize_str($self->msgstr) if $self->msgstr;
286              
287 1049 100       1855 if (my $msgstr_n = $self->msgstr_n) {
288 9         63 $dump .= "${obsolete}msgstr[$_] " . $self->_normalize_str($$msgstr_n{$_})
289 9         68 for sort { $a <=> $b } keys %$msgstr_n;
290             }
291              
292 1049         977 $dump .= "\n";
293 1049         3539 return $dump;
294             }
295              
296             sub _dump_multi_comment {
297 1032     1032   906 my $self = shift;
298 1032         833 my $comment = shift;
299 1032         801 my $leader = shift;
300 1032         837 my $chopped = $leader;
301 1032         960 chop($chopped);
302 1032         1131 my $result = $leader . $comment;
303 1032         1264 $result =~ s/\n/\n$leader/g;
304 1032         2558 $result =~ s/^$leader$/$chopped/gm;
305 1032         942 $result .= "\n";
306 1032         1887 return $result;
307             }
308              
309             # Quote a string properly
310             sub quote {
311 2429     2429 1 1963 my $self = shift;
312 2429         2107 my $string = shift;
313              
314             return undef
315 2429 50       3921 unless defined $string;
316              
317 2429         2529 $string =~ s/\\(?!t)/\\\\/g; # \t is a tab
318 2429         1963 $string =~ s/"/\\"/g;
319 2429         2614 $string =~ s/\n/\\n/g;
320 2429         5820 return "\"$string\"";
321             }
322              
323             sub dequote {
324 4343     4343 1 3998 my $self = shift;
325 4343         5468 my $string = shift;
326              
327             return undef
328 4343 50       6747 unless defined $string;
329              
330 4343         14118 $string =~ s/^"(.*)"/$1/;
331 4343         4972 $string =~ s/\\"/"/g;
332 4343         4426 $string =~ s/(?
333 4343         3784 $string =~ s/(?
334 4343         3363 $string =~ s/(?
335 4343         3459 $string =~ s/\\{4}n/\\\\n/g; # \ followed by inline newline
336 4343         3526 $string =~ s/\\\\(?!n)/\\/g; # all slashes not related to a newline
337 4343         7763 return $string;
338             }
339              
340             sub save_file_fromarray {
341 8     8 1 3520 my $self = shift;
342 8         64 $self->_save_file(0, @_);
343             }
344              
345             sub save_file_fromhash {
346 0     0 1 0 my $self = shift;
347 0         0 $self->_save_file(1, @_);
348             }
349              
350             sub _save_file {
351 8     8   20 my $self = shift;
352 8         17 my $ashash = shift;
353 8         12 my $file = shift;
354 8         13 my $entries = shift;
355 8         13 my $encoding = shift;
356              
357 8 100       22721 open(OUT, defined($encoding) ? ">:encoding($encoding)" : ">", $file)
    50          
358             or return undef;
359 8 50       92 if ($ashash) {
360 0         0 foreach (sort keys %$entries) {
361 0         0 print OUT $entries->{$_}->dump;
362             }
363             }
364             else {
365 8         29 foreach (@$entries) {
366 1037         1634 print OUT $_->dump;
367             }
368             }
369              
370 8         558 close OUT;
371             }
372              
373             sub load_file_asarray {
374 9     9 1 2190 my $self = shift;
375 9         48 $self->_load_file(0, @_);
376             }
377              
378             sub load_file_ashash {
379 0     0 1 0 my $self = shift;
380 0         0 $self->_load_file(1, @_);
381             }
382              
383             sub _load_file {
384 9     9   19 my $self = shift;
385 9         16 my $ashash = shift;
386 9         17 my $file = shift;
387 9         14 my $encoding = shift;
388 9   33     80 my $class = ref $self || $self;
389 9         15 my (@entries, %entries);
390 9         70 my $line_number = 0;
391 9         17 my $po;
392             my %buffer;
393 0         0 my $last_buffer;
394              
395 9 100   1   393 open(IN, defined($encoding) ? "<:encoding($encoding)" : "<", $file)
  1 50       11  
  1         3  
  1         9  
396             or return undef;
397              
398 9         12293 while () {
399 4314         4018 chomp;
400 4314         3080 $line_number++;
401              
402             #
403             # Strip trailing \r\n chars
404             #
405             # This can possibly have an effect only on msys (on which chomp
406             # seems to leave some trailing \r chars) and on MacOS that has
407             # reversed newline (\n\r).
408             # Note that our stripping of those trailing chars is only going to be
409             # useful when writing from one platform and reading on another.
410 4314         18886 s{[\r\n]*$}{};
411              
412 4314 100 100     33574 if (/^$/) {
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
413              
414             # Empty line. End of an entry.
415              
416 1037 50       1705 if (defined($po)) {
417 1037 100       1673 $po->fuzzy_msgctxt($buffer{fuzzy_msgctxt})
418             if defined $buffer{fuzzy_msgctxt};
419 1037 100       1592 $po->fuzzy_msgid($buffer{fuzzy_msgid}) if defined $buffer{fuzzy_msgid};
420 1037 100       1462 $po->fuzzy_msgid_plural($buffer{fuzzy_msgid_plural})
421             if defined $buffer{fuzzy_msgid_plural};
422 1037 100       1431 $po->msgctxt($buffer{msgctxt}) if defined $buffer{msgctxt};
423 1037 50       2610 $po->msgid($buffer{msgid}) if defined $buffer{msgid};
424 1037 100       1835 $po->msgid_plural($buffer{msgid_plural}) if defined $buffer{msgid_plural};
425 1037 100       2287 $po->msgstr($buffer{msgstr}) if defined $buffer{msgstr};
426 1037 100       1706 $po->msgstr_n($buffer{msgstr_n}) if defined $buffer{msgstr_n};
427              
428              
429             # ashash
430 1037 50       1273 if ($ashash) {
431 0 0       0 $entries{$po->msgid} = $po
432             if ($po->_hash_key_ok(\%entries));
433             }
434              
435             # asarray
436             else {
437 1037         1180 push(@entries, $po);
438             }
439              
440 1037         1003 undef $po;
441 1037         767 undef $last_buffer;
442 1037         4234 %buffer = ();
443             }
444             }
445             elsif (/^#\s+(.*)/ or /^#()$/) {
446              
447             # Translator comments
448 19 100       66 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
449 19 100       47 if (defined($po->comment)) {
450 15         26 $po->comment($po->comment . "\n$1");
451             }
452             else {
453 4         18 $po->comment($1);
454             }
455             }
456             elsif (/^#\.\s*(.*)/) {
457              
458             # Automatic comments
459 0 0       0 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
460 0 0       0 if (defined($po->automatic)) {
461 0         0 $po->automatic($po->automatic . "\n$1");
462             }
463             else {
464 0         0 $po->automatic($1);
465             }
466             }
467             elsif (/^#:\s+(.*)/) {
468              
469             # reference
470 1026 100       3759 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
471 1026 100       1658 if (defined($po->reference)) {
472 2         6 $po->reference($po->reference . "\n$1");
473             }
474             else {
475 1024         1269 $po->reference($1);
476             }
477             }
478             elsif (/^#,\s+(.*)/) {
479              
480             # flags
481 20         90 my @flags = split /\s*[,]\s*/, $1;
482 20 100       64 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
483 20         37 foreach my $flag (@flags) {
484 24         81 $po->add_flag($flag);
485             }
486             }
487             elsif (/^#(~)?\|\s+msgctxt\s+(.*)/) {
488 1 50       7 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
489 1         2 $buffer{fuzzy_msgctxt} = $self->dequote($2);
490 1         1 $last_buffer = \$buffer{fuzzy_msgctxt};
491 1 50       4 $po->obsolete(1) if $1;
492             }
493             elsif (/^#(~)?\|\s+msgid\s+(.*)/) {
494 7 50       12 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
495 7         12 $buffer{fuzzy_msgid} = $self->dequote($2);
496 7         7 $last_buffer = \$buffer{fuzzy_msgid};
497 7 100       21 $po->obsolete(1) if $1;
498             }
499             elsif (/^#(~)?\|\s+msgid_plural\s+(.*)/) {
500 1 50       2 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
501 1         3 $buffer{fuzzy_msgid_plural} = $self->dequote($2);
502 1         1 $last_buffer = \$buffer{fuzzy_msgid_plural};
503 1 50       4 $po->obsolete(1) if $1;
504             }
505             elsif (/^(#~\s+)?msgctxt\s+(.*)/) {
506 4 50       13 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
507 4         10 $buffer{msgctxt} = $self->dequote($2);
508 4         8 $last_buffer = \$buffer{msgctxt};
509 4 50       29 $po->obsolete(1) if $1;
510             }
511             elsif (/^(#~\s+)?msgid\s+(.*)/) {
512 1039 100       1799 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
513 1039         1941 $buffer{msgid} = $self->dequote($2);
514 1039         1179 $last_buffer = \$buffer{msgid};
515 1039 100       4254 $po->obsolete(1) if $1;
516             }
517             elsif (/^(#~\s+)?msgid_plural\s+(.*)/) {
518 5 50       14 $po = $class->new(-loaded_line_number => $line_number) unless defined($po);
519 5         12 $buffer{msgid_plural} = $self->dequote($2);
520 5         9 $last_buffer = \$buffer{msgid_plural};
521 5 100       29 $po->obsolete(1) if $1;
522             }
523             elsif (/^(?:#~\s+)?msgstr\s+(.*)/) {
524              
525             # translated string
526 1033         1681 $buffer{msgstr} = $self->dequote($1);
527 1033         3348 $last_buffer = \$buffer{msgstr};
528             }
529             elsif (/^(?:#~\s+)?msgstr\[(\d+)\]\s+(.*)/) {
530              
531             # translated string
532 10         26 $buffer{msgstr_n}{$1} = $self->dequote($2);
533 10         50 $last_buffer = \$buffer{msgstr_n}{$1};
534             }
535             elsif (/^(?:#(?:~|~\||\|)\s+)?(".*)/) {
536              
537             # continued string. Accounts for:
538             # normal : "string"
539             # obsolete : #~ "string"
540             # fuzzy : #| "string"
541             # fuzzy+obsolete : #~| "string"
542 112         288 $$last_buffer .= $self->dequote($1);
543             }
544             else {
545 0         0 warn "Strange line at $file line $line_number: [$_]\n";
546             }
547             }
548 9 100       52 if (defined($po)) {
549              
550 2 50       9 $po->msgctxt($buffer{msgctxt})
551             if defined $buffer{msgctxt};
552 2 50       14 $po->msgid($buffer{msgid})
553             if defined $buffer{msgid};
554 2 50       9 $po->msgid_plural($buffer{msgid_plural})
555             if defined $buffer{msgid_plural};
556 2 50       13 $po->msgstr($buffer{msgstr})
557             if defined $buffer{msgstr};
558 2 50       7 $po->msgstr_n($buffer{msgstr_n})
559             if defined $buffer{msgstr_n};
560              
561             # ashash
562 2 50       8 if ($ashash) {
563 0 0       0 if ($po->_hash_key_ok(\%entries)) {
564 0         0 $entries{$po->msgid} = $po;
565             }
566             }
567              
568             # asarray
569             else {
570 2         4 push(@entries, $po);
571             }
572             }
573 9         161 close IN;
574 9 50       94 return ($ashash ? \%entries : \@entries);
575             }
576              
577             sub _hash_key_ok {
578 0     0   0 my ($self, $entries) = @_;
579              
580 0         0 my $key = $self->msgid;
581              
582 0 0       0 if ($entries->{$key}) {
583              
584             # don't overwrite non-obsolete entries with obsolete ones
585 0 0 0     0 return if (($self->obsolete) && (not $entries->{$key}->obsolete));
586              
587             # don't overwrite translated entries with untranslated ones
588 0 0 0     0 return if (($self->msgstr !~ /\w/) && ($entries->{$key}->msgstr =~ /\w/));
589             }
590              
591 0         0 return 1;
592             }
593              
594             # Autoload methods go after =cut, and are processed by the autosplit program.
595              
596             1;
597             __END__