diff options
Diffstat (limited to 'lib/Net/Amazon/Response.pm')
| -rw-r--r-- | lib/Net/Amazon/Response.pm | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/lib/Net/Amazon/Response.pm b/lib/Net/Amazon/Response.pm new file mode 100644 index 0000000..6147e0e --- /dev/null +++ b/lib/Net/Amazon/Response.pm @@ -0,0 +1,214 @@ +###################################################################### +package Net::Amazon::Response; +###################################################################### +use warnings; +use strict; + +use base qw(Net::Amazon); + +use Text::Wrap qw($columns wrap); +use XML::Simple; + +our @FORCE_ARRAY_FIELDS = (); + +__PACKAGE__->make_accessor($_) for qw( + status messages items xmlref total_results); + +################################################## +sub new { +################################################## + my($class, %options) = @_; + + my $self = { + status => "", + messages => [], + items => [], + xmlref => {}, + total_results => undef, + }; + + bless $self, $class; +} + +sub message { + my($self) = @_; + + return join(";",@{$self->{messages}}); +} + +########################################### +sub is_success { +########################################### + my($self) = @_; + + return $self->{status} ? 1 : ""; +} + +########################################### +sub is_error { +########################################### + my($self) = @_; + + return !$self->is_success(); +} + +########################################### +sub push_item { +########################################### + my($self, $item) = @_; + + push @{$self->{items}}, $item; +} + +########################################### +sub as_string { +########################################### + my($self) = @_; + + return Data::Dumper::Dumper($self); +} + +########################################### +sub list_as_string { +########################################### + my($self, @properties) = @_; + + my $full = ""; + + # Column with + $columns = 60; + my $bullet = 1; + + foreach my $property (@properties) { + $full .= "\n" if $full; + my $bullet_string = sprintf("[%d]%s", + $bullet, (" " x (3-length($bullet)))); + $full .= wrap("", " ", $bullet_string . $property->as_string()); + $bullet++; + } + + return $full; +} + +################################################## +sub properties { +################################################## + my($self) = @_; + + my @properties = (); + + if($self->is_success && ref($self->{xmlref}->{Details}) eq 'ARRAY') { + foreach my $xmlref (@{$self->{xmlref}->{Details}}) { + my $property = Net::Amazon::Property::factory(xmlref => $xmlref); + push @properties, $property; + } + } + + if(wantarray) { + return (@properties); + } + + if(@properties) { + # Scalar context and we've got results. Return the first one. + return $properties[0]; + } + + # Scalar context and we don't have anything. + return undef; +} + +################################################## +sub xml_parse { +################################################## + my($self, $xml) = @_; + + my $xs = XML::Simple->new(); + return $xs->XMLin($xml, ForceArray => [ @FORCE_ARRAY_FIELDS ]); +} + +1; + +__END__ + +=head1 NAME + +Net::Amazon::Response - Baseclass for responses from Amazon's web service + +=head1 SYNOPSIS + + $resp = $ua->request($request); + + if($resp->is_success()) { + print $resp->as_string(); + } + + if($resp->is_error()) { + print $resp->message(); + } + + if($resp->is_success()) { + for my $property ($resp->properties) { + print $property->as_string(), "\n"; + } + } + +=head1 DESCRIPTION + +C<Net::Amazon::Response> is the baseclass for responses coming back +from the useragent's C<request> method. Responses are typically +not of type C<Net::Amazon::Response> but one of its subclasses +C<Net::Amazon::Response::*>. However, for basic error handling and +dumping content, C<Net::Amazon::Response>'s methods are typically used, +because we typically don't know what type of object we're +actually dealing with. + +=head2 METHODS + +=over 4 + +=item is_success() + +Returns true if the request was successful. This doesn't mean any objects +have been found, it just indicates a successful roundtrip. + +=item is_error() + +Returns true if an error occurred. Use C<message()> to determine what +kind of error. + +=item properties() + +Returns the list of C<Net::Amazon::Property> objects which were found +by the query. + +=item as_string() + +Dumps the content of the response. + +=item message() + +Returns the error message as a string in case an error occurred. In case +several errors occurred, they're stringed together. Look up C<messages()> +if you need them separated. + +=item messages() + +Returns all error messages for a response as a reference to an array +of string messages. + +=back + +=head1 SEE ALSO + +=head1 AUTHOR + +Mike Schilli, E<lt>m@perlmeister.comE<gt> + +=head1 COPYRIGHT AND LICENSE + +Copyright 2003 by Mike Schilli E<lt>m@perlmeister.comE<gt> + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut |
