line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Payvment::Facebook::API;
|
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
13997
|
use warnings;
|
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
38
|
|
4
|
1
|
|
|
1
|
|
6
|
use strict;
|
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
31
|
|
5
|
1
|
|
|
1
|
|
15026
|
use LWP::UserAgent;
|
|
1
|
|
|
|
|
106206
|
|
|
1
|
|
|
|
|
48
|
|
6
|
1
|
|
|
1
|
|
8669
|
use Data::Dumper;
|
|
1
|
|
|
|
|
12998
|
|
|
1
|
|
|
|
|
2191
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
=head1 NAME
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
Payvment::API - Payvment Facebook API
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
=head1 VERSION
|
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
Version 0.01
|
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
This module presents an easy to use Payvment API for Creating a webstore on Facebook.
|
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
Pl. have a look at scripts in the folder for more details
|
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
use Payvment::Facebook::API;
|
23
|
|
|
|
|
|
|
use Data::Dumper;
|
24
|
|
|
|
|
|
|
use DBI;
|
25
|
|
|
|
|
|
|
use DBD::mysql;
|
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
my $xml = "product";
|
28
|
|
|
|
|
|
|
my $operation = "generatexml";
|
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
my $infile={product=>'productout.xml',
|
31
|
|
|
|
|
|
|
product_status => 'productoutstatus.xml'
|
32
|
|
|
|
|
|
|
};
|
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
my $pfapi = Payvment::Facebook::API->new(
|
35
|
|
|
|
|
|
|
'payvment_id' => '', # Enter values here
|
36
|
|
|
|
|
|
|
'payvment_api_key' => '' # Enter values here
|
37
|
|
|
|
|
|
|
);
|
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
if ( $operation eq 'generatexml' ) {
|
40
|
|
|
|
|
|
|
open FILE, ">".$infile->{$xml};
|
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
$pfapi->generate_xml(
|
43
|
|
|
|
|
|
|
'method' => $xml,
|
44
|
|
|
|
|
|
|
'type' => 'header',
|
45
|
|
|
|
|
|
|
'filehandle' => *FILE
|
46
|
|
|
|
|
|
|
);
|
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
my $images = [];
|
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
# push @$images, $image_url; #repeat this
|
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
$pfapi->generate_xml(
|
54
|
|
|
|
|
|
|
'method' => 'product',
|
55
|
|
|
|
|
|
|
'type' => 'body',
|
56
|
|
|
|
|
|
|
'filehandle' => *FILE,
|
57
|
|
|
|
|
|
|
name => $row->{name},
|
58
|
|
|
|
|
|
|
description => $row->{description},
|
59
|
|
|
|
|
|
|
price => $row->{price},
|
60
|
|
|
|
|
|
|
currency => $row->{currency},
|
61
|
|
|
|
|
|
|
qty => $row->{qty},
|
62
|
|
|
|
|
|
|
enable_additional_qty => $row->{enable_additional_qty},
|
63
|
|
|
|
|
|
|
weight => $row->{weight},
|
64
|
|
|
|
|
|
|
weight_unit => $row->{weight_unit},
|
65
|
|
|
|
|
|
|
sku => $row->{sku},
|
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
images => $images,
|
68
|
|
|
|
|
|
|
new_state => $row->{new_state},
|
69
|
|
|
|
|
|
|
tags => $row->{tags},
|
70
|
|
|
|
|
|
|
is_taxable => $row->{is_taxable},
|
71
|
|
|
|
|
|
|
categories => $row->{ppcategories},
|
72
|
|
|
|
|
|
|
client_category_name => $row->{client_category_name}
|
73
|
|
|
|
|
|
|
);
|
74
|
|
|
|
|
|
|
}
|
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
$pfapi->generate_xml(
|
77
|
|
|
|
|
|
|
'method' => 'product',
|
78
|
|
|
|
|
|
|
'type' => 'footer',
|
79
|
|
|
|
|
|
|
'filehandle' => *FILE
|
80
|
|
|
|
|
|
|
);
|
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
close FILE;
|
83
|
|
|
|
|
|
|
print "done create xml";
|
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
} elsif ( $operation eq 'submit' ) {
|
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
open FILE, "<".$infile->{$xml} or die"cannt open file";
|
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
my $cont = $pfapi->submitxml(
|
91
|
|
|
|
|
|
|
'method' => $xml,
|
92
|
|
|
|
|
|
|
'filehandle' => *FILE
|
93
|
|
|
|
|
|
|
);
|
94
|
|
|
|
|
|
|
my $user = "dbuser";
|
95
|
|
|
|
|
|
|
my $pass = 'password';
|
96
|
|
|
|
|
|
|
my $dsn = 'dbi:mysql:db:localhost:3306';
|
97
|
|
|
|
|
|
|
my $dbh = DBI->connect( $dsn, $user, $pass )
|
98
|
|
|
|
|
|
|
or die "Can't connect to the DB: $DBI::errstr\n";
|
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
my $query =
|
101
|
|
|
|
|
|
|
"insert into payvment_requests(pr_responsecont,pr_dated,pr_type) values(?, now(),?)";
|
102
|
|
|
|
|
|
|
my $sth = $dbh->prepare($query);
|
103
|
|
|
|
|
|
|
$sth->bind_param( 1, $cont->{cont} );
|
104
|
|
|
|
|
|
|
$sth->bind_param( 2, $xml );
|
105
|
|
|
|
|
|
|
$sth->execute;
|
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
close FILE or die"";
|
108
|
|
|
|
|
|
|
print "done submit xml";
|
109
|
|
|
|
|
|
|
}
|
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
=head1 FUNCTIONS
|
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head2 new
|
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=cut
|
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
our $VERSION = '0.01';
|
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
sub new {
|
123
|
0
|
|
|
0
|
1
|
|
my $self = shift;
|
124
|
0
|
|
|
|
|
|
my %options = @_;
|
125
|
0
|
|
|
|
|
|
my %url = (
|
126
|
|
|
|
|
|
|
'urlproduct' => 'https://api.payvment.com/1/admin/products/import',
|
127
|
|
|
|
|
|
|
'urlproduct_status' => 'https://api.payvment.com/1/admin/status/import'
|
128
|
|
|
|
|
|
|
);
|
129
|
0
|
|
|
|
|
|
my $options = {
|
130
|
|
|
|
|
|
|
"payvment_id" => $options{payvment_id},
|
131
|
|
|
|
|
|
|
"payvment_api_key" => $options{'payvment_api_key'},
|
132
|
|
|
|
|
|
|
%url
|
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
};
|
135
|
0
|
|
|
|
|
|
my $obj = bless $options, $self;
|
136
|
|
|
|
|
|
|
}
|
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
sub submitxml {
|
139
|
0
|
|
|
0
|
1
|
|
my ( $self, %options ) = @_;
|
140
|
|
|
|
|
|
|
return {
|
141
|
0
|
|
|
|
|
|
'err' => 1,
|
142
|
|
|
|
|
|
|
'message' => 'Found incompatible method ' . $options{'method'}
|
143
|
|
|
|
|
|
|
}
|
144
|
0
|
0
|
|
|
|
|
if ( !grep { $_ eq $options{'method'} }
|
145
|
|
|
|
|
|
|
( 'product', 'product_status', 'order', 'update_inventory' ) );
|
146
|
0
|
|
|
|
|
|
my $ua = LWP::UserAgent->new;
|
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
# $ua->timeout(10);
|
149
|
|
|
|
|
|
|
|
150
|
0
|
|
|
|
|
|
my $filecont = "";
|
151
|
0
|
|
|
|
|
|
my $cont;
|
152
|
0
|
|
|
|
|
|
while ( read( $options{filehandle}, $cont, 1000 ) ) {
|
153
|
0
|
|
|
|
|
|
$filecont .= $cont;
|
154
|
|
|
|
|
|
|
}
|
155
|
|
|
|
|
|
|
|
156
|
0
|
|
|
|
|
|
my $req = HTTP::Request->new( POST => $self->{ 'url' . $options{method} } );
|
157
|
0
|
|
|
|
|
|
$req->authorization_basic( $self->{payvment_id},
|
158
|
|
|
|
|
|
|
$self->{payvment_api_key} );
|
159
|
0
|
|
|
|
|
|
$req->content_type('application/x-www-form-urlencoded');
|
160
|
|
|
|
|
|
|
#print $filecont;
|
161
|
0
|
|
|
|
|
|
$req->content($filecont);
|
162
|
|
|
|
|
|
|
|
163
|
0
|
|
|
|
|
|
my $res = $ua->request($req);
|
164
|
0
|
0
|
|
|
|
|
if ( $res->is_success ) {
|
165
|
0
|
|
|
|
|
|
return { 'err' => 0, cont => $res->decoded_content };
|
166
|
|
|
|
|
|
|
}
|
167
|
|
|
|
|
|
|
else {
|
168
|
0
|
|
|
|
|
|
return { 'err' => 1, cont => $res->status_line };
|
169
|
|
|
|
|
|
|
}
|
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
# $self->_submitxml(%options);
|
172
|
|
|
|
|
|
|
}
|
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
sub generate_xml {
|
175
|
0
|
|
|
0
|
0
|
|
my ( $self, %options ) = @_;
|
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
return {
|
178
|
0
|
|
|
|
|
|
'err' => 1,
|
179
|
|
|
|
|
|
|
'message' => 'Found incompatible method ' . $options{'method'}
|
180
|
|
|
|
|
|
|
}
|
181
|
0
|
0
|
|
|
|
|
if ( !grep { $_ eq $options{'method'} }
|
182
|
|
|
|
|
|
|
( 'product', 'product_status', 'order', 'update_inventory' ) );
|
183
|
|
|
|
|
|
|
|
184
|
0
|
|
|
|
|
|
return { 'err' => 1, 'message' => 'Found incompatible type' }
|
185
|
0
|
0
|
|
|
|
|
if ( !grep { $_ eq $options{'type'} } ( 'header', 'body', 'footer' ) );
|
186
|
|
|
|
|
|
|
|
187
|
0
|
0
|
0
|
|
|
|
$self->_generate_product_xml_header(%options)
|
188
|
|
|
|
|
|
|
if $options{'type'} eq "header" && $options{method} eq "product";
|
189
|
|
|
|
|
|
|
|
190
|
0
|
0
|
0
|
|
|
|
$self->_generate_product_xml_body(%options)
|
191
|
|
|
|
|
|
|
if $options{'type'} eq "body" && $options{method} eq "product";
|
192
|
|
|
|
|
|
|
|
193
|
0
|
0
|
0
|
|
|
|
$self->_generate_product_xml_footer(%options)
|
194
|
|
|
|
|
|
|
if $options{'type'} eq "footer" && $options{method} eq "product";
|
195
|
0
|
|
|
|
|
|
return { err => 0 };
|
196
|
|
|
|
|
|
|
}
|
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
sub _generate_product_xml_header {
|
199
|
0
|
|
|
0
|
|
|
my ( $self, %options ) = @_;
|
200
|
0
|
|
|
|
|
|
print "hi";
|
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
#print Dumper %options;
|
203
|
0
|
|
|
|
|
|
print { $options{filehandle} }
|
|
0
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
"\n"
|
205
|
|
|
|
|
|
|
. "\n"
|
206
|
|
|
|
|
|
|
. "\n"
|
207
|
|
|
|
|
|
|
. ""
|
208
|
|
|
|
|
|
|
. $self->{payvment_id}
|
209
|
|
|
|
|
|
|
. "\n"
|
210
|
|
|
|
|
|
|
. "1.x"
|
211
|
|
|
|
|
|
|
. "XML\n"
|
212
|
|
|
|
|
|
|
. "\n"
|
213
|
|
|
|
|
|
|
. "\n";
|
214
|
|
|
|
|
|
|
}
|
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
sub _generate_product_xml_body {
|
217
|
0
|
|
|
0
|
|
|
my ( $self, %options ) = @_;
|
218
|
0
|
|
|
|
|
|
print { $options{filehandle} } "\n" . ""
|
|
0
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
. _cdata( $options{"name"} )
|
220
|
|
|
|
|
|
|
. "\n"
|
221
|
|
|
|
|
|
|
. ""
|
222
|
|
|
|
|
|
|
. _cdata( $options{"description"} )
|
223
|
|
|
|
|
|
|
. "\n"
|
224
|
|
|
|
|
|
|
. ""
|
225
|
|
|
|
|
|
|
. _escapexml( $options{"price"} )
|
226
|
|
|
|
|
|
|
. "\n"
|
227
|
|
|
|
|
|
|
. ""
|
228
|
|
|
|
|
|
|
. _escapexml( $options{"currency"} )
|
229
|
|
|
|
|
|
|
. "\n" . ""
|
230
|
|
|
|
|
|
|
. _escapexml( $options{"qty"} )
|
231
|
|
|
|
|
|
|
. "\n"
|
232
|
|
|
|
|
|
|
. ""
|
233
|
|
|
|
|
|
|
. _escapexml( $options{"enable_additional_qty"} )
|
234
|
|
|
|
|
|
|
. "\n"
|
235
|
|
|
|
|
|
|
. ""
|
236
|
|
|
|
|
|
|
. _escapexml( $options{"weight"} )
|
237
|
|
|
|
|
|
|
. "\n"
|
238
|
|
|
|
|
|
|
. ""
|
239
|
|
|
|
|
|
|
. _escapexml( $options{"weight_unit"} )
|
240
|
|
|
|
|
|
|
. "\n" . ""
|
241
|
|
|
|
|
|
|
. _cdata( $options{"sku"} )
|
242
|
|
|
|
|
|
|
. "\n"
|
243
|
|
|
|
|
|
|
. ""
|
244
|
|
|
|
|
|
|
. $self->_print_images( 'images' => $options{'images'} )
|
245
|
|
|
|
|
|
|
. ""
|
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
. ""
|
248
|
|
|
|
|
|
|
. _escapexml( $options{"new_state"} )
|
249
|
|
|
|
|
|
|
. "\n"
|
250
|
|
|
|
|
|
|
. ""
|
251
|
|
|
|
|
|
|
. _cdata( $options{"tags"} )
|
252
|
|
|
|
|
|
|
. "\n"
|
253
|
|
|
|
|
|
|
. ""
|
254
|
|
|
|
|
|
|
. _escapexml( $options{"is_taxable"} )
|
255
|
|
|
|
|
|
|
. "\n"
|
256
|
|
|
|
|
|
|
. ""
|
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
. $self->_print_categories( 'categories' => $options{'categories'} )
|
259
|
|
|
|
|
|
|
. ""
|
260
|
|
|
|
|
|
|
. ""
|
261
|
|
|
|
|
|
|
. _cdata( $options{"client_category_name"} )
|
262
|
|
|
|
|
|
|
. "\n"
|
263
|
|
|
|
|
|
|
."UPS"
|
264
|
|
|
|
|
|
|
. "\n";
|
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
}
|
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
sub _generate_product_xml_footer {
|
269
|
0
|
|
|
0
|
|
|
my ( $self, %options ) = @_;
|
270
|
|
|
|
|
|
|
|
271
|
0
|
|
|
|
|
|
print { $options{filehandle} } "\n";
|
|
0
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
}
|
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
sub _print_categories {
|
276
|
0
|
|
|
0
|
|
|
my ( $self, %options ) = @_;
|
277
|
0
|
|
|
|
|
|
my $ret;
|
278
|
0
|
|
|
|
|
|
foreach my $cat ( split( /\,/, $options{categories} ) ) {
|
279
|
0
|
|
|
|
|
|
$ret .= "" . _escapexml($cat) . " \n";
|
280
|
|
|
|
|
|
|
}
|
281
|
0
|
|
|
|
|
|
return $ret;
|
282
|
|
|
|
|
|
|
}
|
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
sub _print_images {
|
285
|
0
|
|
|
0
|
|
|
my ( $self, %options ) = @_;
|
286
|
0
|
|
|
|
|
|
my $ret;
|
287
|
0
|
|
|
|
|
|
foreach my $img ( @{ $options{images} } ) {
|
|
0
|
|
|
|
|
|
|
288
|
0
|
|
|
|
|
|
$ret .= "" . _escapexml($img) . "\n";
|
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
}
|
291
|
0
|
|
|
|
|
|
return $ret;
|
292
|
|
|
|
|
|
|
}
|
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
sub _escapexml {
|
295
|
0
|
|
|
0
|
|
|
my ($var) = @_;
|
296
|
0
|
|
|
|
|
|
$var =~ s/</isg;
|
297
|
0
|
|
|
|
|
|
$var =~ s/>/>/isg;
|
298
|
0
|
|
|
|
|
|
$var =~ s/&/&/isg;
|
299
|
0
|
|
|
|
|
|
return $var;
|
300
|
|
|
|
|
|
|
}
|
301
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
sub _cdata {
|
303
|
0
|
|
|
0
|
|
|
my ($var) = @_;
|
304
|
0
|
|
|
|
|
|
return "";
|
305
|
|
|
|
|
|
|
}
|
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
#notes: Generate XML. Product, UpdateInventory,Product Status, Order. - SubmitXML to Paymemnt
|
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
=head1 AUTHOR
|
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
"abhishek jain", C<< <"goyali at cpan.org"> >>
|
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
=head1 BUGS
|
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
Please report any bugs or feature requests directly to the author at C<< <"goyali at cpan.org"> >>
|
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
=head1 SUPPORT
|
320
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command.
|
322
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
perldoc Payvment::Facebook::API
|
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
You can also email the author and rest assured of the reply
|
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE
|
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
Copyright 2011 "abhishek jain".
|
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
Licence This is free software; you can redistribute it and/or modify it under
|
332
|
|
|
|
|
|
|
the same terms as the Perl 5 programming language system itself.
|
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
This API lets one to list products and sell on facebook using the Payvment Facebook App.
|
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
At the moment these methods are implemented:
|
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
=over 4
|
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
=item C
|
343
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
A constructor
|
345
|
|
|
|
|
|
|
|
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=item C
|
348
|
|
|
|
|
|
|
As in Synopsis.
|
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
=item C
|
351
|
|
|
|
|
|
|
As in Synopsis.
|
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
=back
|
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
=head1 NOTE:
|
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
This module is provided as is, and is still underdevelopment, not suitable for Production use.
|
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
Virus free , Spam Free , Spyware Free Software and hopefully Money free software .
|
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
For more details on payvment visit http://www.payvment.com
|
362
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
=head1 AUTHOR
|
364
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
goyali at cpan.org
|
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
=head1 SEE ALSO
|
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
http://www.ejain.com
|
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
http://www.payvment.com
|
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
=cut
|
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
1;
|