—package
WWW::Contact::Base;
use
Moose;
use
Data::Dumper;
our
$VERSION
=
'0.14'
;
our
$AUTHORITY
=
'cpan:FAYLAND'
;
my
$sub_verbose
=
sub
{
my
$msg
=
shift
;
$msg
=~ s/\s+$//;
STDERR
"$msg\n"
;
};
subtype
'Verbose'
=> as
'CodeRef'
=> where { 1; };
coerce
'Verbose'
=> from
'Int'
=> via {
if
(
$_
) {
return
$sub_verbose
;
}
else
{
return
sub
{ 0 };
}
};
has
'verbose'
=> (
is
=>
'rw'
,
isa
=>
'Verbose'
,
coerce
=> 1,
default
=> 0 );
has
'ua_class'
=> (
is
=>
'rw'
,
isa
=>
'Str'
,
default
=>
'WWW::Mechanize'
);
has
'ua'
=> (
is
=>
'rw'
,
isa
=>
'Object'
,
lazy
=> 1,
default
=>
sub
{
my
$class
= (
shift
)->ua_class;
eval
"use $class"
;
croak $@
if
($@);
$class
->new(
agent
=>
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'
,
cookie_jar
=> {},
stack_depth
=> 1,
timeout
=> 60,
);
}
);
has
'errstr'
=> (
is
=>
'rw'
,
isa
=>
'Maybe[Str]'
);
sub
debug {
my
$self
=
shift
;
return
unless
$self
->verbose;
$self
->verbose->(
@_
);
}
sub
debug_to_file {
my
(
$self
,
$file
) =
@_
;
return
unless
$self
->verbose;
open
(
my
$fh
,
'>'
,
$file
);
$fh
Dumper(\
$self
->ua);
close
(
$fh
);
}
sub
get_contacts_from_outlook_csv {
my
(
$self
,
$csv
) =
@_
;
my
@contacts
;
# Name,E-mail Address,Notes,
my
@lines
=
split
(/\n/,
$csv
);
shift
@lines
;
# skip the first line
foreach
my
$line
(
@lines
) {
my
@cols
=
split
(
','
,
$line
);
next
if
(
$cols
[1] !~ /\@/ );
# skip unknow lines
push
@contacts
, {
name
=>
$cols
[0],
=>
$cols
[1]
};
}
return
wantarray
?
@contacts
: \
@contacts
;
}
sub
get {
my
$self
=
shift
;
my
$resp
=
$self
->ua->get(
@_
);
unless
(
$resp
->is_success ) {
$self
->errstr(
$resp
->as_string() );
return
;
}
return
1;
}
sub
submit_form {
my
$self
=
shift
;
my
$resp
=
$self
->ua->submit_form(
@_
);
unless
(
$resp
->is_success ) {
$self
->errstr(
$resp
->as_string() );
return
;
}
return
1;
}
no
Moose;
no
Moose::Util::TypeConstraints;
__PACKAGE__->meta->make_immutable;
1;
__END__
=head1 NAME
WWW::Contact::Base - Base module for WWW::Contact::*
=head1 SYNOPSIS
use WWW::Contact::MyMail;
use Moose;
extends 'WWW::Contact::Base';
sub get_contacts {
my ($self, $email, $password) = @_;
# reset
$self->errstr(undef);
my @contacts;
my $ua = $self->ua;
$self->debug("start get_contacts from MyMail");
# get contacts
return wantarray ? @contacts : \@contacts;
}
=head1 DESCRIPTION
This module is mainly for you to write your own WWW::Contact::* (and used in my WWW::Contact::)
=head1 METHODS
=over 4
=item ua
an instance of L<WWW::Mechanize>
$self->ua->get('http://www.google.com');
If u want to use WWW::Mechanize::* instead of WWW::Mechanize, try
extends 'WWW::Contact::Base';
has '+ua_class' => ( default => 'WWW::Mechanize::GZip' );
=item verbose
turn on debug, default is off
$self->verbose(1); # turn on
$self->verbose(0); # turn off
=item debug
write debug info depends on $self->verbose
$self->debug("start get_contacts from MyMail");
=item debug_to_file($file)
Dumper(\$self->ua) to $file
$self->debug_to_file($file)
=item get
a wrapper of $self->ua->get, with $resp->is_success check
$self->get('http://www.google.com');
=item submit_form
a wrapper of $self->ua->submit_form, with $resp->is_success check
$self->submit_form(
form_number => 1,
fields => {
Email => $email,
Passwd => $password,
}
);
=back
=head1 SEE ALSO
L<WWW::Contact>, L<WWW::Mechanize>, L<Moose>
=head1 AUTHOR
Fayland Lam, C<< <fayland at gmail.com> >>
=head1 COPYRIGHT & LICENSE
Copyright 2008 Fayland Lam, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut