diff options
Diffstat (limited to 'lib/WebService/ForecastIo.pm')
-rw-r--r-- | lib/WebService/ForecastIo.pm | 69 |
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 } |