line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
4
|
|
|
4
|
|
91847
|
use strict; |
|
4
|
|
|
|
|
9
|
|
|
4
|
|
|
|
|
107
|
|
2
|
4
|
|
|
4
|
|
20
|
use warnings; |
|
4
|
|
|
|
|
7
|
|
|
4
|
|
|
|
|
223
|
|
3
|
|
|
|
|
|
|
package Return::Value; |
4
|
|
|
|
|
|
|
# ABSTRACT: (deprecated) polymorphic return values |
5
|
|
|
|
|
|
|
# vi:et:sw=4 ts=4 |
6
|
|
|
|
|
|
|
$Return::Value::VERSION = '1.666005'; |
7
|
4
|
|
|
4
|
|
19
|
use Exporter 5.57 'import'; |
|
4
|
|
|
|
|
95
|
|
|
4
|
|
|
|
|
163
|
|
8
|
4
|
|
|
4
|
|
23
|
use Carp (); |
|
4
|
|
|
|
|
7
|
|
|
4
|
|
|
|
|
2361
|
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our @EXPORT = qw[success failure]; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
#pod =head1 DO NOT USE THIS LIBRARY |
13
|
|
|
|
|
|
|
#pod |
14
|
|
|
|
|
|
|
#pod Return::Value was a bad idea. I'm sorry that I had it, sorry that I followed |
15
|
|
|
|
|
|
|
#pod through, and sorry that it got used in other useful libraries. Fortunately |
16
|
|
|
|
|
|
|
#pod there are not many things using it. One of those things is |
17
|
|
|
|
|
|
|
#pod L which is also deprecated in favor of |
18
|
|
|
|
|
|
|
#pod L. |
19
|
|
|
|
|
|
|
#pod |
20
|
|
|
|
|
|
|
#pod There's no reason to specify a new module to replace Return::Value. In |
21
|
|
|
|
|
|
|
#pod general, routines should return values of uniform type or throw exceptions. |
22
|
|
|
|
|
|
|
#pod Return::Value tried to be a uniform type for all routines, but has so much |
23
|
|
|
|
|
|
|
#pod weird behavior that it ends up being confusing and not very Perl-like. |
24
|
|
|
|
|
|
|
#pod |
25
|
|
|
|
|
|
|
#pod Objects that are false are just a dreadful idea in almost every circumstance, |
26
|
|
|
|
|
|
|
#pod especially when the object has useful properties. |
27
|
|
|
|
|
|
|
#pod |
28
|
|
|
|
|
|
|
#pod B |
29
|
|
|
|
|
|
|
#pod |
30
|
|
|
|
|
|
|
#pod A release of this library in June 2009 promised that deprecation warnings would |
31
|
|
|
|
|
|
|
#pod start being issued in June 2010. It is now December 2012, and the warnings are |
32
|
|
|
|
|
|
|
#pod now being issued. They can be disabled through means made clear from the |
33
|
|
|
|
|
|
|
#pod source. |
34
|
|
|
|
|
|
|
#pod |
35
|
|
|
|
|
|
|
#pod =head1 SYNOPSIS |
36
|
|
|
|
|
|
|
#pod |
37
|
|
|
|
|
|
|
#pod Used with basic function-call interface: |
38
|
|
|
|
|
|
|
#pod |
39
|
|
|
|
|
|
|
#pod use Return::Value; |
40
|
|
|
|
|
|
|
#pod |
41
|
|
|
|
|
|
|
#pod sub send_over_network { |
42
|
|
|
|
|
|
|
#pod my ($net, $send) = @_: |
43
|
|
|
|
|
|
|
#pod if ( $net->transport( $send ) ) { |
44
|
|
|
|
|
|
|
#pod return success; |
45
|
|
|
|
|
|
|
#pod } else { |
46
|
|
|
|
|
|
|
#pod return failure "Was not able to transport info."; |
47
|
|
|
|
|
|
|
#pod } |
48
|
|
|
|
|
|
|
#pod } |
49
|
|
|
|
|
|
|
#pod |
50
|
|
|
|
|
|
|
#pod my $result = $net->send_over_network( "Data" ); |
51
|
|
|
|
|
|
|
#pod |
52
|
|
|
|
|
|
|
#pod # boolean |
53
|
|
|
|
|
|
|
#pod unless ( $result ) { |
54
|
|
|
|
|
|
|
#pod # string |
55
|
|
|
|
|
|
|
#pod print $result; |
56
|
|
|
|
|
|
|
#pod } |
57
|
|
|
|
|
|
|
#pod |
58
|
|
|
|
|
|
|
#pod Or, build your Return::Value as an object: |
59
|
|
|
|
|
|
|
#pod |
60
|
|
|
|
|
|
|
#pod sub build_up_return { |
61
|
|
|
|
|
|
|
#pod my $return = failure; |
62
|
|
|
|
|
|
|
#pod |
63
|
|
|
|
|
|
|
#pod if ( ! foo() ) { |
64
|
|
|
|
|
|
|
#pod $return->string("Can't foo!"); |
65
|
|
|
|
|
|
|
#pod return $return; |
66
|
|
|
|
|
|
|
#pod } |
67
|
|
|
|
|
|
|
#pod |
68
|
|
|
|
|
|
|
#pod if ( ! bar() ) { |
69
|
|
|
|
|
|
|
#pod $return->string("Can't bar"); |
70
|
|
|
|
|
|
|
#pod $return->prop(failures => \@bars); |
71
|
|
|
|
|
|
|
#pod return $return; |
72
|
|
|
|
|
|
|
#pod } |
73
|
|
|
|
|
|
|
#pod |
74
|
|
|
|
|
|
|
#pod # we're okay if we made it this far. |
75
|
|
|
|
|
|
|
#pod $return++; |
76
|
|
|
|
|
|
|
#pod return $return; # success! |
77
|
|
|
|
|
|
|
#pod } |
78
|
|
|
|
|
|
|
#pod |
79
|
|
|
|
|
|
|
#pod =head1 DESCRIPTION |
80
|
|
|
|
|
|
|
#pod |
81
|
|
|
|
|
|
|
#pod Polymorphic return values are a horrible idea, but this library was written |
82
|
|
|
|
|
|
|
#pod based on the notion that they were useful. Often, we just want to know if |
83
|
|
|
|
|
|
|
#pod something worked or not. Other times, we'd like to know what the error text |
84
|
|
|
|
|
|
|
#pod was. Still others, we may want to know what the error code was, and what the |
85
|
|
|
|
|
|
|
#pod error properties were. We don't want to handle objects or data structures for |
86
|
|
|
|
|
|
|
#pod every single return value, but we do want to check error conditions in our code |
87
|
|
|
|
|
|
|
#pod because that's what good programmers do. |
88
|
|
|
|
|
|
|
#pod |
89
|
|
|
|
|
|
|
#pod When functions are successful they may return true, or perhaps some useful |
90
|
|
|
|
|
|
|
#pod data. In the quest to provide consistent return values, this gets confusing |
91
|
|
|
|
|
|
|
#pod between complex, informational errors and successful return values. |
92
|
|
|
|
|
|
|
#pod |
93
|
|
|
|
|
|
|
#pod This module provides these features with a simplistic API that should get you |
94
|
|
|
|
|
|
|
#pod what you're looking for in each context a return value is used in. |
95
|
|
|
|
|
|
|
#pod |
96
|
|
|
|
|
|
|
#pod =head2 Attributes |
97
|
|
|
|
|
|
|
#pod |
98
|
|
|
|
|
|
|
#pod All return values have a set of attributes that package up the information |
99
|
|
|
|
|
|
|
#pod returned. All attributes can be accessed or changed via methods of the same |
100
|
|
|
|
|
|
|
#pod name, unless otherwise noted. Many can also be accessed via overloaded |
101
|
|
|
|
|
|
|
#pod operations on the object, as noted below. |
102
|
|
|
|
|
|
|
#pod |
103
|
|
|
|
|
|
|
#pod =over 4 |
104
|
|
|
|
|
|
|
#pod |
105
|
|
|
|
|
|
|
#pod =item type |
106
|
|
|
|
|
|
|
#pod |
107
|
|
|
|
|
|
|
#pod A value's type is either "success" or "failure" and (obviously) reflects |
108
|
|
|
|
|
|
|
#pod whether the value is returning success or failure. |
109
|
|
|
|
|
|
|
#pod |
110
|
|
|
|
|
|
|
#pod =item errno |
111
|
|
|
|
|
|
|
#pod |
112
|
|
|
|
|
|
|
#pod The errno attribute stores the error number of the return value. For |
113
|
|
|
|
|
|
|
#pod success-type results, it is by default undefined. For other results, it |
114
|
|
|
|
|
|
|
#pod defaults to 1. |
115
|
|
|
|
|
|
|
#pod |
116
|
|
|
|
|
|
|
#pod =item string |
117
|
|
|
|
|
|
|
#pod |
118
|
|
|
|
|
|
|
#pod The value's string attribute is a simple message describing the value. |
119
|
|
|
|
|
|
|
#pod |
120
|
|
|
|
|
|
|
#pod =item data |
121
|
|
|
|
|
|
|
#pod |
122
|
|
|
|
|
|
|
#pod The data attribute stores a reference to a hash or array, and can be used as a |
123
|
|
|
|
|
|
|
#pod simple way to return extra data. Data stored in the data attribute can be |
124
|
|
|
|
|
|
|
#pod accessed by dereferencing the return value itself. (See below.) |
125
|
|
|
|
|
|
|
#pod |
126
|
|
|
|
|
|
|
#pod =item prop |
127
|
|
|
|
|
|
|
#pod |
128
|
|
|
|
|
|
|
#pod The most generic attribute of all, prop is a hashref that can be used to pass |
129
|
|
|
|
|
|
|
#pod an arbitrary number of data structures, just like the data attribute. Unlike |
130
|
|
|
|
|
|
|
#pod the data attribute, though, these structures must be retrieved via method calls. |
131
|
|
|
|
|
|
|
#pod |
132
|
|
|
|
|
|
|
#pod =back |
133
|
|
|
|
|
|
|
#pod |
134
|
|
|
|
|
|
|
#pod =head1 FUNCTIONS |
135
|
|
|
|
|
|
|
#pod |
136
|
|
|
|
|
|
|
#pod The functional interface is highly recommended for use within functions |
137
|
|
|
|
|
|
|
#pod that are using C for return values. It's simple and |
138
|
|
|
|
|
|
|
#pod straightforward, and builds the entire return value in one statement. |
139
|
|
|
|
|
|
|
#pod |
140
|
|
|
|
|
|
|
#pod =over 4 |
141
|
|
|
|
|
|
|
#pod |
142
|
|
|
|
|
|
|
#pod =cut |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
# This hack probably impacts performance more than I'd like to know, but it's |
145
|
|
|
|
|
|
|
# needed to have a hashref object that can deref into a different hash. |
146
|
|
|
|
|
|
|
# _ah($self,$key, [$value) sets or returns the value for the given key on the |
147
|
|
|
|
|
|
|
# $self blessed-ref |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
sub _ah { |
150
|
95
|
|
|
95
|
|
162
|
my ($self, $key, $value) = @_; |
151
|
95
|
|
|
|
|
152
|
my $class = ref $self; |
152
|
95
|
|
|
|
|
196
|
bless $self => "ain't::overloaded"; |
153
|
95
|
100
|
|
|
|
217
|
$self->{$key} = $value if @_ > 2; |
154
|
95
|
|
|
|
|
186
|
my $return = $self->{$key}; |
155
|
95
|
|
|
|
|
174
|
bless $self => $class; |
156
|
95
|
|
|
|
|
600
|
return $return; |
157
|
|
|
|
|
|
|
} |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
sub _builder { |
160
|
23
|
|
|
23
|
|
67
|
my %args = (type => shift); |
161
|
23
|
100
|
|
|
|
83
|
$args{string} = shift if (@_ % 2); |
162
|
23
|
|
|
|
|
94
|
%args = (%args, @_); |
163
|
|
|
|
|
|
|
|
164
|
23
|
100
|
|
|
|
82
|
$args{string} = $args{type} unless defined $args{string}; |
165
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
$args{errno} = ($args{type} eq 'success' ? undef : 1) |
167
|
23
|
100
|
|
|
|
94
|
unless defined $args{errno}; |
|
|
100
|
|
|
|
|
|
168
|
|
|
|
|
|
|
|
169
|
23
|
|
|
|
|
98
|
__PACKAGE__->new(%args); |
170
|
|
|
|
|
|
|
} |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
#pod =item success |
173
|
|
|
|
|
|
|
#pod |
174
|
|
|
|
|
|
|
#pod The C function returns a C with the type "success". |
175
|
|
|
|
|
|
|
#pod |
176
|
|
|
|
|
|
|
#pod Additional named parameters may be passed to set the returned object's |
177
|
|
|
|
|
|
|
#pod attributes. The first, optional, parameter is the string attribute and does |
178
|
|
|
|
|
|
|
#pod not need to be named. All other parameters must be passed by name. |
179
|
|
|
|
|
|
|
#pod |
180
|
|
|
|
|
|
|
#pod # simplest possible case |
181
|
|
|
|
|
|
|
#pod return success; |
182
|
|
|
|
|
|
|
#pod |
183
|
|
|
|
|
|
|
#pod =cut |
184
|
|
|
|
|
|
|
|
185
|
10
|
|
|
10
|
1
|
1826
|
sub success { _builder('success', @_) } |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
#pod =pod |
188
|
|
|
|
|
|
|
#pod |
189
|
|
|
|
|
|
|
#pod =item failure |
190
|
|
|
|
|
|
|
#pod |
191
|
|
|
|
|
|
|
#pod C is identical to C, but returns an object with the type |
192
|
|
|
|
|
|
|
#pod "failure" |
193
|
|
|
|
|
|
|
#pod |
194
|
|
|
|
|
|
|
#pod =cut |
195
|
|
|
|
|
|
|
|
196
|
13
|
|
|
13
|
1
|
2284
|
sub failure { _builder('failure', @_) } |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
#pod =pod |
199
|
|
|
|
|
|
|
#pod |
200
|
|
|
|
|
|
|
#pod =back |
201
|
|
|
|
|
|
|
#pod |
202
|
|
|
|
|
|
|
#pod =head1 METHODS |
203
|
|
|
|
|
|
|
#pod |
204
|
|
|
|
|
|
|
#pod The object API is useful in code that is catching C objects. |
205
|
|
|
|
|
|
|
#pod |
206
|
|
|
|
|
|
|
#pod =over 4 |
207
|
|
|
|
|
|
|
#pod |
208
|
|
|
|
|
|
|
#pod =item new |
209
|
|
|
|
|
|
|
#pod |
210
|
|
|
|
|
|
|
#pod my $return = Return::Value->new( |
211
|
|
|
|
|
|
|
#pod type => 'failure', |
212
|
|
|
|
|
|
|
#pod string => "YOU FAIL", |
213
|
|
|
|
|
|
|
#pod prop => { |
214
|
|
|
|
|
|
|
#pod failed_objects => \@objects, |
215
|
|
|
|
|
|
|
#pod }, |
216
|
|
|
|
|
|
|
#pod ); |
217
|
|
|
|
|
|
|
#pod |
218
|
|
|
|
|
|
|
#pod Creates a new C object. Named parameters can be used to set the |
219
|
|
|
|
|
|
|
#pod object's attributes. |
220
|
|
|
|
|
|
|
#pod |
221
|
|
|
|
|
|
|
#pod =cut |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
sub new { |
224
|
25
|
|
|
25
|
1
|
56
|
my $class = shift; |
225
|
25
|
|
|
|
|
177
|
bless { type => 'failure', string => q{}, prop => {}, @_ } => $class; |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
#pod =pod |
229
|
|
|
|
|
|
|
#pod |
230
|
|
|
|
|
|
|
#pod =item bool |
231
|
|
|
|
|
|
|
#pod |
232
|
|
|
|
|
|
|
#pod print "it worked" if $result->bool; |
233
|
|
|
|
|
|
|
#pod |
234
|
|
|
|
|
|
|
#pod Returns the result in boolean context: true for success, false for failure. |
235
|
|
|
|
|
|
|
#pod |
236
|
|
|
|
|
|
|
#pod =item prop |
237
|
|
|
|
|
|
|
#pod |
238
|
|
|
|
|
|
|
#pod printf "%s: %s', |
239
|
|
|
|
|
|
|
#pod $result->string, join ' ', @{$result->prop('strings')} |
240
|
|
|
|
|
|
|
#pod unless $result->bool; |
241
|
|
|
|
|
|
|
#pod |
242
|
|
|
|
|
|
|
#pod Returns the return value's properties. Accepts the name of |
243
|
|
|
|
|
|
|
#pod a property returned, or returns the properties hash reference |
244
|
|
|
|
|
|
|
#pod if given no name. |
245
|
|
|
|
|
|
|
#pod |
246
|
|
|
|
|
|
|
#pod =item other attribute accessors |
247
|
|
|
|
|
|
|
#pod |
248
|
|
|
|
|
|
|
#pod Simple accessors exist for the object's other attributes: C, C, |
249
|
|
|
|
|
|
|
#pod C, and C. |
250
|
|
|
|
|
|
|
#pod |
251
|
|
|
|
|
|
|
#pod =cut |
252
|
|
|
|
|
|
|
|
253
|
30
|
100
|
|
30
|
1
|
891
|
sub bool { _ah($_[0],'type') eq 'success' ? 1 : 0 } |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
sub type { |
256
|
4
|
|
|
4
|
1
|
9
|
my ($self, $value) = @_; |
257
|
4
|
100
|
|
|
|
18
|
return _ah($self, 'type') unless @_ > 1; |
258
|
3
|
100
|
100
|
|
|
174
|
Carp::croak "invalid result type: $value" |
259
|
|
|
|
|
|
|
unless $value eq 'success' or $value eq 'failure'; |
260
|
2
|
|
|
|
|
22
|
return _ah($self, 'type', $value); |
261
|
|
|
|
|
|
|
}; |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
foreach my $name ( qw[errno string data] ) { |
264
|
|
|
|
|
|
|
## no critic (ProhibitNoStrict) |
265
|
4
|
|
|
4
|
|
23
|
no strict 'refs'; |
|
4
|
|
|
|
|
19
|
|
|
4
|
|
|
|
|
2522
|
|
266
|
|
|
|
|
|
|
*{$name} = sub { |
267
|
40
|
|
|
40
|
|
69
|
my ($self, $value) = @_; |
268
|
40
|
100
|
|
|
|
149
|
return _ah($self, $name) unless @_ > 1; |
269
|
2
|
|
|
|
|
5
|
return _ah($self, $name, $value); |
270
|
|
|
|
|
|
|
}; |
271
|
|
|
|
|
|
|
} |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
sub prop { |
274
|
5
|
|
|
5
|
1
|
7
|
my ($self, $name, $value) = @_; |
275
|
5
|
100
|
|
|
|
19
|
return _ah($self, 'prop') unless $name; |
276
|
2
|
100
|
|
|
|
7
|
return _ah($self, 'prop')->{$name} unless @_ > 2; |
277
|
1
|
|
|
|
|
3
|
return _ah($self, 'prop')->{$name} = $value; |
278
|
|
|
|
|
|
|
} |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
#pod =pod |
281
|
|
|
|
|
|
|
#pod |
282
|
|
|
|
|
|
|
#pod =back |
283
|
|
|
|
|
|
|
#pod |
284
|
|
|
|
|
|
|
#pod =head2 Overloading |
285
|
|
|
|
|
|
|
#pod |
286
|
|
|
|
|
|
|
#pod Several operators are overloaded for C objects. They are |
287
|
|
|
|
|
|
|
#pod listed here. |
288
|
|
|
|
|
|
|
#pod |
289
|
|
|
|
|
|
|
#pod =over 4 |
290
|
|
|
|
|
|
|
#pod |
291
|
|
|
|
|
|
|
#pod =item Stringification |
292
|
|
|
|
|
|
|
#pod |
293
|
|
|
|
|
|
|
#pod print "$result\n"; |
294
|
|
|
|
|
|
|
#pod |
295
|
|
|
|
|
|
|
#pod Stringifies to the string attribute. |
296
|
|
|
|
|
|
|
#pod |
297
|
|
|
|
|
|
|
#pod =item Boolean |
298
|
|
|
|
|
|
|
#pod |
299
|
|
|
|
|
|
|
#pod print $result unless $result; |
300
|
|
|
|
|
|
|
#pod |
301
|
|
|
|
|
|
|
#pod Returns the C representation. |
302
|
|
|
|
|
|
|
#pod |
303
|
|
|
|
|
|
|
#pod =item Numeric |
304
|
|
|
|
|
|
|
#pod |
305
|
|
|
|
|
|
|
#pod Also returns the C value. |
306
|
|
|
|
|
|
|
#pod |
307
|
|
|
|
|
|
|
#pod =item Dereference |
308
|
|
|
|
|
|
|
#pod |
309
|
|
|
|
|
|
|
#pod Dereferencing the value as a hash or array will return the value of the data |
310
|
|
|
|
|
|
|
#pod attribute, if it matches that type, or an empty reference otherwise. You can |
311
|
|
|
|
|
|
|
#pod check C<< ref $result->data >> to determine what kind of data (if any) was |
312
|
|
|
|
|
|
|
#pod passed. |
313
|
|
|
|
|
|
|
#pod |
314
|
|
|
|
|
|
|
#pod =cut |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
use overload |
317
|
1
|
|
|
1
|
|
4
|
'""' => sub { shift->string }, |
318
|
13
|
|
|
13
|
|
4293
|
'bool' => sub { shift->bool }, |
319
|
11
|
|
|
11
|
|
1939
|
'==' => sub { shift->bool == shift }, |
320
|
1
|
|
|
1
|
|
84
|
'!=' => sub { shift->bool != shift }, |
321
|
1
|
|
|
1
|
|
3
|
'>' => sub { shift->bool > shift }, |
322
|
1
|
|
|
1
|
|
4
|
'<' => sub { shift->bool < shift }, |
323
|
11
|
|
|
11
|
|
119
|
'eq' => sub { shift->string eq shift }, |
324
|
2
|
|
|
2
|
|
465
|
'ne' => sub { shift->string ne shift }, |
325
|
2
|
|
|
2
|
|
460
|
'gt' => sub { shift->string gt shift }, |
326
|
2
|
|
|
2
|
|
454
|
'lt' => sub { shift->string lt shift }, |
327
|
1
|
|
|
1
|
|
8
|
'++' => sub { _ah(shift,'type','success') }, |
328
|
1
|
|
|
1
|
|
406
|
'--' => sub { _ah(shift,'type','failure') }, |
329
|
3
|
100
|
|
3
|
|
426
|
'${}' => sub { my $data = _ah($_[0],'data'); $data ? \$data : \undef }, |
|
3
|
|
|
|
|
22
|
|
330
|
3
|
100
|
|
3
|
|
10
|
'%{}' => sub { ref _ah($_[0],'data') eq 'HASH' ? _ah($_[0],'data') : {} }, |
331
|
4
|
100
|
|
4
|
|
15
|
'@{}' => sub { ref _ah($_[0],'data') eq 'ARRAY' ? _ah($_[0],'data') : [] }, |
332
|
4
|
|
|
4
|
|
6910
|
fallback => 1; |
|
4
|
|
|
|
|
4894
|
|
|
4
|
|
|
|
|
185
|
|
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
#pod =pod |
335
|
|
|
|
|
|
|
#pod |
336
|
|
|
|
|
|
|
#pod =back |
337
|
|
|
|
|
|
|
#pod |
338
|
|
|
|
|
|
|
#pod =cut |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
"This return value is true."; |
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
__END__ |