diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2007-08-13 18:41:27 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2007-08-13 18:41:27 +0000 |
| commit | bcbf441e09fb502cf64924ff2530fa144bdf52c5 (patch) | |
| tree | f377707a2dac078db8cd0c7d7abfe69ac1006d71 /lib/Net/Amazon/Property.pm | |
| download | xxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.gz xxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.bz2 | |
* Move files to trunk
Diffstat (limited to 'lib/Net/Amazon/Property.pm')
| -rw-r--r-- | lib/Net/Amazon/Property.pm | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/lib/Net/Amazon/Property.pm b/lib/Net/Amazon/Property.pm new file mode 100644 index 0000000..6c06957 --- /dev/null +++ b/lib/Net/Amazon/Property.pm @@ -0,0 +1,320 @@ +###################################################################### +package Net::Amazon::Property; +###################################################################### +use warnings; +use strict; +use base qw(Net::Amazon); + +use Net::Amazon::Property::DVD; +use Net::Amazon::Property::Book; +use Net::Amazon::Property::Music; +use Net::Amazon::Attribute::ReviewSet; +use Data::Dumper; +use Log::Log4perl qw(:easy); + +use warnings; +use strict; + +our @DEFAULT_ATTRIBUTES = qw( + OurPrice ImageUrlLarge ImageUrlMedium ImageUrlSmall + ReleaseDate Catalog Asin url Manufacturer UsedPrice + ListPrice ProductName Availability SalesRank + Media NumMedia ProductDescription + CollectiblePrice CollectibleCount NumberOfOfferings + UsedCount ThirdPartyNewPrice ThirdPartyNewCount + ThirdPartyProductInfo +); + +__PACKAGE__->make_accessor($_) for @DEFAULT_ATTRIBUTES; +__PACKAGE__->make_accessor($_) for qw(year review_set); +__PACKAGE__->make_array_accessor($_) for qw(browse_nodes similar_asins); + +################################################## +sub new { +################################################## + my($class, %options) = @_; + + if(!$options{xmlref}) { + die "Mandatory param xmlref missing"; + } + + my $self = { + %options, + }; + + bless $self, $class; + + # Set default attributes + for my $attr (@DEFAULT_ATTRIBUTES) { + $self->$attr($options{xmlref}->{$attr}); + } + + # The release date is sometimes missing + if($options{xmlref}->{ReleaseDate}) { + my ($year) = ($options{xmlref}->{ReleaseDate} =~ /(\d{4})/); + $self->year($year); + } else { + $self->year(""); + } + + my $browse_nodes = $options{xmlref}->{BrowseList}->{BrowseNode}; + if(ref($browse_nodes) eq "ARRAY") { + my @nodes = map { + $_->{BrowseName} + } @{ $browse_nodes }; + $self->browse_nodes(\@nodes); + } elsif (ref($browse_nodes) eq "HASH") { + $self->browse_nodes([ $browse_nodes->{BrowseName} ]); + } else { + $self->browse_nodes([ ]); + } + + my $similar = $options{xmlref}->{SimilarProducts}; + if(ref($similar) eq "HASH") { + $self->similar_asins($similar->{Product}); + } else { + $self->similar_asins([ ]); + } + + return $self; +} + +################################################## +sub as_string { +################################################## + my($self) = @_; + + my $result = "\"$self->{xmlref}->{ProductName}\", "; + + if($self->{xmlref}->{Manufacturer}) { + $result .= "$self->{xmlref}->{Manufacturer}, "; + } + + $result .= $self->year() . ", " if $self->year(); + + $result .= $self->OurPrice() . ", "; + $result .= $self->Asin(); + return $result; +} + +################################################## +sub factory { +################################################## + my(%options) = @_; + + my $xmlref = $options{xmlref}; + die "Called factory without xmlref" unless $xmlref; + + # DEBUG(sub {"factory xmlref=" . Data::Dumper::Dumper($xmlref)}); + + my $catalog = $xmlref->{Catalog}; + my $obj; + + if(0) { + } elsif($catalog eq "Book") { + DEBUG("Creating new Book Property"); + $obj = Net::Amazon::Property::Book->new(xmlref => $xmlref); + } elsif($catalog eq "Music") { + DEBUG("Creating new Music Property"); + $obj = Net::Amazon::Property::Music->new(xmlref => $xmlref); + } elsif($catalog eq "DVD") { + DEBUG("Creating new DVD Property"); + $obj = Net::Amazon::Property::DVD->new(xmlref => $xmlref); + } else { + DEBUG("Creating new Default Property ($catalog)"); + $obj = Net::Amazon::Property->new(xmlref => $xmlref); + } + + return $obj; +} + +################################################## +sub init_via_xmlref { +################################################## + my($self, $xmlref) = @_; + + my $reviewset = Net::Amazon::Attribute::ReviewSet->new(); + + if(exists $xmlref->{Reviews}) { + $reviewset->init_via_xmlref($xmlref->{Reviews}); + } + + $self->review_set($reviewset); +} + +1; + +__END__ + +=head1 NAME + +Net::Amazon::Property - Baseclass for products on amazon.com + +=head1 SYNOPSIS + + use Net::Amazon; + + # ... + + if($resp->is_success()) { + for my $prop ($resp->properties) { + print $_->ProductName(), " ", + $_->Manufacturer(), " ", + $_->OurPrice(), "\n"; + +=head1 DESCRIPTION + +C<Net::Amazon::Property> is the baseclass for results returned +from Amazon web service queries. The term 'properties' is used as +a generic description for an item on amazon.com. + +Typically, the C<properties()> method of a C<Net::Amazon::Response::*> object +will return one or more objects of class C<Net::Amazon::Property> or +one of its subclasses, e.g. C<Net::Amazon::Property::Book> or +C<Net::Amazon::Property::CD>. + +While C<Net::Amazon::Property> objects expose accessors for all +fields returned in the XML response (like C<OurPrice()>, C<ListPrice()>, +C<Manufacturer()>, C<Asin()>, C<Catalog()>, C<ProductName()>, subclasses +might define their own accessors to more class-specific fields +(like the iC<Net::Amazon::Property::Book>'s C<authors()> method returning +a list of authors, while C<Net::Amazon::Property>'s C<Authors()> method +will return a reference to a sub-hash containing a C<Author> field, just like +the response's XML contained it). + +=head2 METHODS + +Methods vary, depending on the item returned from a query. Here's the most +common ones. They're all accessors, meaning they can be used like C<Method()> +to retrieve the value or like C<Method($value)> to set the value of the +field. + +=over 4 + +=item Asin() + +The item's ASIN number. + +=item ProductName() + +Book title, CD album name or item name + +=item Availability() + +Text string describing if the item is available. Examples: +C<"Usually ships within 24 hours"> or +C<"Out of Print--Limited Availability">. + +=item Catalog() + +Shows the catalog the item was found in: C<Book>, C<Music>, C<Classical>, +C<Electronics> etc. + +=item Authors() + +Returns a sub-hash with a C<Author> key, which points to either a single +$scalar or to a reference of an array containing author names as scalars. + +=item ReleaseDate() + +Item's release date, format is "NN Monthname, Year". + +=item Manufacturer() + +Music label, publishing company or manufacturer + +=item ImageUrlSmall() + +URL to a small (thumbnail) image of the item + +=item ImageUrlMedium() + +URL to a medium-size image of the item + +=item ImageUrlLarge() + +URL to a large image of the item + +=item ListPrice() + +List price of the item + +=item OurPrice() + +Amazon price of the item + +=item UsedPrice() + +Used price of the item + +=item SalesRank() + +Sales rank of the item (contains digits and commas, like 1,000,001) + +=item Media() + +Type of media (Paperback, etc.). + +=item NumMedia() + +Number of media the item carries (1,2 CDs etc.). + +=item ProductDescription() + +Lengthy textual description of the product. + +=item CollectiblePrice() + +Lowest price in "Collectible" category. + +=item CollectibleCount() + +Number of offerings in "Collectible" category. + +=item NumberOfOfferings() + +Total number of offerings in all categories. + +=item UsedCount() + +Number of offerings in "Used" category. + +=item ThirdPartyNewPrice() + +Lowest price in "Third Party New" category. + +=item ThirdPartyNewCount() + +Number of offerings in "Third Party New" category. + +=item year() + +The release year extracted from ReleaseDate(). + +=item browse_nodes() + +Returns a list of browse nodes (text string categories) for this item. + +=item similar_asins() + +Returns a list of ASINs of similar items for this item. + +=back + +Please check the subclasses of C<Net::Amazon::Property> for specialized +methods. + +=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 |
