package WWW::Unfuddle;
use Moose;
use LWP::UserAgent;
use JSON;
use WWW::Unfuddle::Project;
has username => (
is => 'ro',
isa => 'Str',
required => 1,
);
has password => (
is => 'ro',
isa => 'Str',
required => 1,
);
has subdomain => (
is => 'ro',
isa => 'Str',
required => 1,
);
has ua => (
is => 'ro',
isa => 'LWP::UserAgent',
lazy => 1,
default => sub {
my $self = shift;
my $ua = LWP::UserAgent->new;
$ua->credentials($self->_domain . ':80', 'Unfuddle API',
$self->username, $self->password);
return $ua;
},
);
sub _domain {
my $self = shift;
return $self->subdomain . '.unfuddle.com';
}
sub _api_url {
my $self = shift;
my @path = @_;
return 'http://' . $self->_domain . '/api/v1/' . join('/', @path) . '.json';
}
sub request {
my $self = shift;
my ($method, @path) = @_;
my $req = HTTP::Request->new($method => $self->_api_url(@path));
$req->header(Accept => 'application/json');
my $resp = $self->ua->request($req);
if ($resp->code != 200) {
confess sprintf 'Error (%d): %s', $resp->code, $resp->content;
}
return from_json($resp->content);
}
sub get {
my $self = shift;
$self->request(GET => @_);
}
sub projects {
my $self = shift;
return map { WWW::Unfuddle::Project->new($_) } @{ $self->get('projects') };
}
__PACKAGE__->meta->make_immutable;
no Moose;
1;