summaryrefslogtreecommitdiff
path: root/lib/WebService/ForecastIo.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/WebService/ForecastIo.pm')
-rw-r--r--lib/WebService/ForecastIo.pm69
1 files changed, 34 insertions, 35 deletions
diff --git a/lib/WebService/ForecastIo.pm b/lib/WebService/ForecastIo.pm
index c336378..0a2dfb3 100644
--- a/lib/WebService/ForecastIo.pm
+++ b/lib/WebService/ForecastIo.pm
@@ -1,29 +1,31 @@
package WebService::ForecastIo;
-use Moose;
-use MooseX::Types::URI 'Uri';
-use MooseX::Types::DateTime;
-use MooseX::Params::Validate;
-use Moose::Util::TypeConstraints;
-use DateTime::Format::ISO8601;
+use Moo;
+use 5.10.0;
+use Types::Standard -types,'slurpy';
+use Type::Utils -all;
+use Types::URI 'Uri';
+use Types::DateTime 'DateTimeT';
+use Type::Params;
use WebService::ForecastIo::Response;
+use DateTime::TimeZone;
+use namespace::autoclean;
has base_uri => (
is => 'ro',
isa => Uri,
- coerce => 1,
default => 'https://api.forecast.io/forecast',
+ coerce => Uri->coercion,
);
has api_key => (
is => 'ro',
- isa => 'Str',
+ isa => Str,
required => 1,
);
has user_agent => (
- is => 'ro',
+ is => 'lazy',
isa => duck_type(['get']),
- lazy_build => 1,
);
sub _build_user_agent {
require LWP::UserAgent;
@@ -37,9 +39,9 @@ sub _build_user_agent {
}
sub _make_request_uri {
- my ($self,%opts) = @_;
+ my ($self,$opts) = @_;
- my ($lat,$lon,$time) = delete @opts{qw(latitude longitude time)};
+ my ($lat,$lon,$time) = delete @$opts{qw(latitude longitude time)};
my $req_uri = $self->base_uri->clone;
@@ -63,43 +65,40 @@ sub _make_request_uri {
$time_str,
);
- if ($opts{exclude}) {
- $opts{exclude} = join ',',@{$opts{exclude}};
+ if ($opts->{exclude}) {
+ $opts->{exclude} = join ',',@{$opts->{exclude}};
}
- $req_uri->query_form(\%opts);
+ $req_uri->query_form($opts);
return $req_uri;
}
-enum my $units_type=__PACKAGE__.'::units',
- [qw(us si ca uk auto)];
-enum my $block_type=__PACKAGE__.'::block',
- [qw(currently minutely hourly daily alerts flags sources)];
-
-coerce 'DateTime', from 'Str',
- via {
- s{([+-])(\d\d)(\d\d)\z}{$1$2:$3};
- DateTime::Format::ISO8601->new->parse_datetime($_)
- };
+my $units_type = enum [qw(us si ca uk auto)];
+my $block_type = enum [qw(currently minutely hourly daily alerts flags sources)];
sub request {
- my ($self,%opts) = validated_hash(
- \@_,
- latitude => { isa => 'Num' },
- longitude => { isa => 'Num' },
- time => { isa => 'DateTime', optional => 1, coerce => 1 },
- units => { isa => $units_type, default => 'si' },
- exclude => { isa => "ArrayRef[$block_type]", default => sub { [] } },
- raw => { isa => 'Bool', default => 0 },
+ state $argcheck = compile(
+ Object, Dict[
+ latitude => Num,
+ longitude => Num,
+ time => Optional[DateTimeT],
+ units => Optional[$units_type],
+ exclude => Optional[ArrayRef[$block_type]],
+ raw => Optional[Bool],
+ ],
);
+ my ($self,$opts) = $argcheck->(@_);
+ $opts->{units} //= 'si';
+ $opts->{exclude} //= [];
+ $opts->{raw} //= 0;
- my $uri = $self->_make_request_uri(%opts);
+ my $uri = $self->_make_request_uri($opts);
my $response = $self->user_agent->get($uri);
if ($response->is_success) {
my $json = $response->decoded_content;
- return $json if $opts{raw};
+ return $json if $opts->{raw};
my $res = WebService::ForecastIo::Response->new($json);
return wantarray ? ($res,$json) : $res
}