line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DBIx::SimpleGoBetween; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
34580
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
48
|
|
4
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
37
|
|
5
|
1
|
|
|
1
|
|
5
|
use vars qw($VERSION); |
|
1
|
|
|
|
|
8
|
|
|
1
|
|
|
|
|
67
|
|
6
|
1
|
|
|
1
|
|
5
|
use Carp qw(croak); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
132
|
|
7
|
|
|
|
|
|
|
$VERSION = '1.003'; |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 NAME |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
DBIx::SimpleGoBetween - DBI Wrapper interface |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 SYNOPSIS |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
use DBIx::SimpleGoBetween; |
17
|
|
|
|
|
|
|
use DBI; |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
my $dbh=DBI->connect(blah blah blah); |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
my $db=DBIx::SimpleGoBetween->new(\$dbh); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
# returns the first column of the first row of your query |
25
|
|
|
|
|
|
|
$count=$db->get_scalar('select count(*) from table_a'); |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
# fetches the entire result set as a single list |
28
|
|
|
|
|
|
|
($max,$sum)=$db->get_list( |
29
|
|
|
|
|
|
|
'select max(column_a) ,sum(column_a) from table_a' |
30
|
|
|
|
|
|
|
); |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# returns a list reference of list references |
33
|
|
|
|
|
|
|
# each list reference represents a row from the result set |
34
|
|
|
|
|
|
|
$array_ref=$db->get_list_of_lists( |
35
|
|
|
|
|
|
|
'select * from table_a' |
36
|
|
|
|
|
|
|
); |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
# returns a list reference of hash references |
39
|
|
|
|
|
|
|
# each hash reference represents a row from the result set |
40
|
|
|
|
|
|
|
$array_ref=$db->get_list_of_hashes( |
41
|
|
|
|
|
|
|
'select * from table_a' |
42
|
|
|
|
|
|
|
); |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# does a prepare then executes the query with the list reference |
45
|
|
|
|
|
|
|
# provide by the 2nd argument |
46
|
|
|
|
|
|
|
$db->sql_do('delete from table_a where column_a=?',[$value]); |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
# Callback |
49
|
|
|
|
|
|
|
# code_ref: is called on a per row basis, arguments based on 'type' |
50
|
|
|
|
|
|
|
# type: array,hash,array_ref,hash_ref |
51
|
|
|
|
|
|
|
$sth=$db->callback( |
52
|
|
|
|
|
|
|
'sql',[execute list],[prepare_args],'type',\&code_ref |
53
|
|
|
|
|
|
|
); |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
=head1 DESCRIPTION |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
DBIx::SimpleGoBetween acts as a go between for DBI and any other development interfaces you use. This package has no iterators, no error checking. It simply returns the result sets in one of many data structure formants. |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
Odds are your result does not need to be processed, just placed in a structure in the order it was retrieved, if so then this is the module you are looking for. |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
Example using HTML::Template |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
use DBI; |
65
|
|
|
|
|
|
|
use DBIx::SimpleGoBetween; |
66
|
|
|
|
|
|
|
use HTML::Template; |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
my $dbh=DBH->connect(); |
69
|
|
|
|
|
|
|
my $db=DBIx::SimpleGoBetween->new(\$dbh); |
70
|
|
|
|
|
|
|
my $tmpl=HTML::Template->new(filename=>'file.tmpl'); |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
$tmpl->param( |
73
|
|
|
|
|
|
|
total_rows=>$db->get_scalar('select count(*) from table_a') |
74
|
|
|
|
|
|
|
,tmpl_loop=>$db->get_list_of_hashes('select * from table_a') |
75
|
|
|
|
|
|
|
); |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=head2 EXPORT |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
None |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=cut |
83
|
|
|
|
|
|
|
|
84
|
1
|
|
|
1
|
|
13
|
use constant key_dbh=>0; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
909
|
|
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
=head2 OO Methods |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
This section documents the OO functions |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=over 4 |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
=item * my $db=DBIx::SimpleGoBetween->new(\$db); |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
This function creates a new instance of DBIx::SimpleGoBetween. |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
=back |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=cut |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
sub new ($) { |
101
|
0
|
|
|
0
|
1
|
|
my ($class,$dbh_ref)=@_; |
102
|
0
|
|
|
|
|
|
bless [$dbh_ref],$class; |
103
|
|
|
|
|
|
|
} |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
=head2 OO interface arguments |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
All OO interfaces in the instance accept the following arguments: |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
-'sql statement' |
110
|
|
|
|
|
|
|
Required argument |
111
|
|
|
|
|
|
|
Must be an "sql statment" or a "prepared statement handle" |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
-[execute list] |
114
|
|
|
|
|
|
|
Optional argument ( manditory if [optional prepare args] is used ) |
115
|
|
|
|
|
|
|
Must be an array reference containing the place holder arguments |
116
|
|
|
|
|
|
|
for the $sth->execute command |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
-[optional prepare args] |
119
|
|
|
|
|
|
|
Optional argument ( manditory if you are using $db->callback ) |
120
|
|
|
|
|
|
|
Must be an array reference of the arguments passed to |
121
|
|
|
|
|
|
|
$dbh->prepare('sql statement',@{[optional prepare args]}) |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
=over 4 |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
=item * my $dbh=$db->dbh; |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
Returns the database handle used to create this instance. |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=cut |
130
|
|
|
|
|
|
|
|
131
|
0
|
|
|
0
|
1
|
|
sub dbh () { ${ $_[0]->[key_dbh] } } |
|
0
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=item * my $sth=$db->prep('sql statement',[prepare_args]); |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
Returns a prepared statement handle. If you pass a prepared statement handle, it returns that statement handle. |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
In reality this is just a wrapper for: |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
my $sth=$db->dbh->prepare('sql statement',@$prepare_args); |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
=cut |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
sub prep { |
144
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$args)=@_; |
145
|
0
|
0
|
|
|
|
|
return $sql if ref($sql); |
146
|
0
|
0
|
|
|
|
|
$args=[] unless $args; |
147
|
0
|
|
|
|
|
|
$s->dbh->prepare($sql,@{$args}); |
|
0
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
} |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=item * $db->callback('sql statement',[execute list],[optional prepare args],type,code_ref); |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
Although DBIx::Simple offers no iterator interfaces, it does offer a callback interface, that allows you consolidate the following operations: prepare, execute, while. |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
Example: |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
# type eq 'array' |
157
|
|
|
|
|
|
|
$db->callback( |
158
|
|
|
|
|
|
|
'sql statement' |
159
|
|
|
|
|
|
|
,[execute list] |
160
|
|
|
|
|
|
|
,[prepare arguments] |
161
|
|
|
|
|
|
|
,'array' |
162
|
|
|
|
|
|
|
,sub { |
163
|
|
|
|
|
|
|
print join(',',@_),"\n"; |
164
|
|
|
|
|
|
|
} |
165
|
|
|
|
|
|
|
); |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
# type eq 'array_ref' |
168
|
|
|
|
|
|
|
$db->callback( |
169
|
|
|
|
|
|
|
'sql statement' |
170
|
|
|
|
|
|
|
,[execute list] |
171
|
|
|
|
|
|
|
,[prepare arguments] |
172
|
|
|
|
|
|
|
,'array_ref' |
173
|
|
|
|
|
|
|
,sub { |
174
|
|
|
|
|
|
|
my ($ref)=@_; |
175
|
|
|
|
|
|
|
print join(',',@$ref),"\n"; |
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
); |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
# type eq 'hash' |
180
|
|
|
|
|
|
|
$db->callback( |
181
|
|
|
|
|
|
|
'sql statement' |
182
|
|
|
|
|
|
|
,[execute list] |
183
|
|
|
|
|
|
|
,[prepare arguments] |
184
|
|
|
|
|
|
|
,'hash' |
185
|
|
|
|
|
|
|
,sub { |
186
|
|
|
|
|
|
|
my %hash=@_; |
187
|
|
|
|
|
|
|
while(my ($key,$value)=each %hash) { |
188
|
|
|
|
|
|
|
print $key,',',$value,"\n"; |
189
|
|
|
|
|
|
|
} |
190
|
|
|
|
|
|
|
} |
191
|
|
|
|
|
|
|
); |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
# type eq 'hash_ref' |
194
|
|
|
|
|
|
|
$db->callback( |
195
|
|
|
|
|
|
|
'sql statement' |
196
|
|
|
|
|
|
|
,[execute list] |
197
|
|
|
|
|
|
|
,[prepare arguments] |
198
|
|
|
|
|
|
|
,'hash' |
199
|
|
|
|
|
|
|
,sub { |
200
|
|
|
|
|
|
|
my ($hash)=@_; |
201
|
|
|
|
|
|
|
while(my ($key,$value)=each %$hash) { |
202
|
|
|
|
|
|
|
print $key,',',$value,"\n"; |
203
|
|
|
|
|
|
|
} |
204
|
|
|
|
|
|
|
} |
205
|
|
|
|
|
|
|
); |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
=cut |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
sub callback { |
210
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$placeholder,$sql_args,$type,$code)=@_; |
211
|
0
|
|
|
|
|
|
my $sth=$s->prep($sql,$sql_args); |
212
|
0
|
|
|
|
|
|
$type=lc($type); |
213
|
0
|
|
|
|
|
|
$sth->execute(@$placeholder); |
214
|
0
|
0
|
|
|
|
|
croak 'not a code ref' unless ref($code) eq 'CODE'; |
215
|
0
|
0
|
|
|
|
|
if($type eq 'hash') { |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
216
|
0
|
|
|
|
|
|
while(my $row=$sth->fetchrow_hashref) { |
217
|
0
|
|
|
|
|
|
$code->(%$row) |
218
|
|
|
|
|
|
|
} |
219
|
|
|
|
|
|
|
} elsif($type eq 'hash_ref') { |
220
|
0
|
|
|
|
|
|
while(my $row=$sth->fetchrow_hashref) { |
221
|
0
|
|
|
|
|
|
$code->($row) |
222
|
|
|
|
|
|
|
} |
223
|
|
|
|
|
|
|
} elsif($type eq 'array') { |
224
|
0
|
|
|
|
|
|
while(my $row=$sth->fetchrow_arrayref) { |
225
|
0
|
|
|
|
|
|
$code->(@$row) |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
} elsif($type eq 'array_ref') { |
228
|
0
|
|
|
|
|
|
while(my $row=$sth->fetchrow_arrayref) { |
229
|
0
|
|
|
|
|
|
$code->($row) |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
} else { |
232
|
0
|
|
|
|
|
|
croak 'unknown type' |
233
|
|
|
|
|
|
|
} |
234
|
|
|
|
|
|
|
} |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
=item * my @list=$db->get_list('sql statement',[execute list],[optional prepare args]); |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
Returns the entire result set as a single list. |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
The [execute list] and [optional prepare args] are optional arguments. |
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
Example: |
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
my ($count,$sum)=$db->get_list( |
245
|
|
|
|
|
|
|
'select max(col_a),sum(col_a) from table' |
246
|
|
|
|
|
|
|
); |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
=cut |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
sub get_list { |
251
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$ph,$arg)=@_; |
252
|
0
|
|
|
|
|
|
my @list; |
253
|
0
|
|
|
0
|
|
|
$s->callback($sql,$ph,$arg,'array',sub { push @list,@_ }); |
|
0
|
|
|
|
|
|
|
254
|
0
|
|
|
|
|
|
@list; |
255
|
|
|
|
|
|
|
} |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=item * my $value=$db->get_scalar('sql statement',[execute list],[optional prepare args]); |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
Returns the first column of the first row as a single scalar value. |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
This function is intended for those situations where your query contains only one value, or you really only care about the very first value in your result set. |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
The [execute list] and [optional prepare args] are optional arguments. |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
=cut |
266
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
sub get_scalar { |
268
|
0
|
|
|
0
|
1
|
|
my ($first)=get_list(@_); |
269
|
0
|
|
|
|
|
|
$first |
270
|
|
|
|
|
|
|
} |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
=item * my $ref=$db->get_list_of_lists('sql statement',[execute list],[optional prepare args]); |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
Returns your result set as a list of list references. |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
The [execute list] and [optional prepare args] are optional arguments. |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
Example: |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
if your query contained 2 rows and 2 columns the data structure |
281
|
|
|
|
|
|
|
would look something like this: |
282
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
$ref->[0]->[0] eq 'value of the first column of the first row' |
284
|
|
|
|
|
|
|
$ref->[0]->[1] eq 'value of the second column of the first row' |
285
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
$ref->[1]->[0] eq 'value of the first column of the second row' |
287
|
|
|
|
|
|
|
$ref->[1]->[1] eq 'value of the second column of the second row' |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
=cut |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
sub get_list_of_lists { |
292
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$ph,$arg)=@_; |
293
|
0
|
|
|
|
|
|
my $list=[]; |
294
|
0
|
|
|
0
|
|
|
$s->callback($sql,$ph,$arg,'array_ref',sub { push @$list, [@{$_[0]}] }); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
295
|
0
|
|
|
|
|
|
$list |
296
|
|
|
|
|
|
|
} |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
=item * my $ref=$db->get_list_of_hashes('sql statement',[execute list],[optional prepare args]); |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
Returns your result as a list of hash references. |
301
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
The [execute list] and [optional prepare args] are optional arguments. |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
Example: |
305
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
if your query contained 2 rows and 2 columns named:( col_a,col_b) |
307
|
|
|
|
|
|
|
the data structure would look something like this: |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
$ref->[0]->{col_a} eq 'value of the first row col_a' |
310
|
|
|
|
|
|
|
$ref->[0]->{col_b} eq 'value of the first row col_b' |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
$ref->[0]->{col_a} eq 'value of the second row col_a' |
313
|
|
|
|
|
|
|
$ref->[0]->{col_b} eq 'value of the second row col_b' |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
=cut |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
sub get_list_of_hashes { |
318
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$ph,$arg)=@_; |
319
|
0
|
|
|
|
|
|
my $list=[]; |
320
|
0
|
|
|
0
|
|
|
$s->callback($sql,$ph,$arg,'hash_ref',sub { push @$list, {%{$_[0]}} }); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
321
|
0
|
|
|
|
|
|
$list |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
=item * $db->sql_do('sql statement',[execute list],[optional prepare args]); |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
This is really a wrapper for the following: |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
my $sth=$dbh->prepare('sql statement',( list of sql args if any )); |
329
|
|
|
|
|
|
|
$sth->execute((execute list); |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
The [execute list] and [optional prepare args] are optional arguments. |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
=cut |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
sub sql_do { |
336
|
0
|
|
|
0
|
1
|
|
my ($s,$sql,$ph,$arg)=@_; |
337
|
0
|
|
|
|
|
|
my $sth=$s->prep($sql,$arg); |
338
|
0
|
|
|
|
|
|
$sth->execute(@$ph); |
339
|
|
|
|
|
|
|
} |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
=pod |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=back |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
=head1 SEE ALSO |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
DBI HTML::Template DBIx::BulkLoader::Mysql DBIx::Simple |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
=head1 Source Forge Porject |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
If you feel this software is useful please donate. |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
L |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
=head1 AUTHOR |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
Michael Shipper |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
Copyright (C) 2010 by Michael Shipper |
362
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or modify |
364
|
|
|
|
|
|
|
it under the same terms as Perl itself, either Perl version 5.8.4 or, |
365
|
|
|
|
|
|
|
at your option, any later version of Perl 5 you may have available. |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
=cut |