package Weather::OpenWeatherMap::Result; $Weather::OpenWeatherMap::Result::VERSION = '0.005004'; use Carp; use strictures 2; use JSON::MaybeXS (); use Module::Runtime 'use_module'; use List::Objects::Types -all; use Types::Standard -all; use Moo; use Storable 'freeze'; sub new_for { my ($class, $type) = splice @_, 0, 2; confess "Expected a subclass type" unless $type; my $subclass = join '::', $class, map ucfirst, split '::', $type; use_module($subclass)->new(@_) } sub decode_json { my (undef, $js) = @_; JSON::MaybeXS->new(utf8 => 1)->decode( $js ) } sub encode_json { my (undef, $data) = @_; JSON::MaybeXS->new(utf8 => 1)->encode( $data ) } has request => ( required => 1, is => 'ro', writer => 'set_request', isa => InstanceOf['Weather::OpenWeatherMap::Request'], ); has json => ( required => 1, is => 'ro', isa => Str, ); has data => ( lazy => 1, is => 'ro', isa => HashObj, coerce => 1, builder => sub { my ($self) = @_; $self->decode_json( $self->json ) }, ); has response_code => ( lazy => 1, is => 'ro', isa => Maybe[Int], builder => sub { my ($self) = @_; $self->data->{cod} }, ); has is_success => ( lazy => 1, is => 'ro', isa => Bool, builder => sub { my ($self) = @_; ($self->response_code // '') eq '200' }, ); has error => ( lazy => 1, is => 'ro', isa => Str, builder => sub { my ($self) = @_; return '' if $self->is_success; my $data = $self->data; my $msg = $data->{message} || 'Unknown error from backend'; # there's only so much I can take -> $msg = 'Not found' if $msg =~ /Not found city/; $msg }, ); 1; =pod =head1 NAME Weather::OpenWeatherMap::Result - Weather lookup result superclass =head1 SYNOPSIS # Normally retrieved via Weather::OpenWeatherMap =head1 DESCRIPTION This is the parent class for L weather results. The L section links known subclasses. =head2 ATTRIBUTES =head3 data This is the decoded hash from the attached L (as a L). Subclasses provide more convenient accessors for retrieving desired information. =head3 error The error message received from the OpenWeatherMap backend (or the empty string if there was no error). See also: L, L =head3 is_success Returns boolean true if the OpenWeatherMap backend returned a successful response. See also: L, L =head3 json The raw JSON this Result was created with. =head3 response_code The response code from OpenWeatherMap. See also: L, L =head3 request The original request that was attached to this result. =head2 METHODS =head3 new_for Factory method; returns a new object belonging to the appropriate subclass: my $result = Weather::OpenWeatherMap::Result->new_for( Forecast => request => $orig_request, json => $raw_json, ); =head3 decode_json Result deserialization wrapper for use by subclasses. =head3 encode_json Serialization wrapper for use by subclasses. =head1 SEE ALSO L L L L L L L L =head1 AUTHOR Jon Portnoy Licensed under the same terms as perl. =cut