| Net-Amazon documentation | Contained in the Net-Amazon distribution. |
Net::Amazon::Property - Baseclass for products on amazon.com
use Net::Amazon;
# ...
if($resp->is_success()) {
for my $prop ($resp->properties) {
print $_->ProductName(), " ",
$_->Manufacturer(), " ",
$_->OurPrice(), "\n";
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 properties() method of a Net::Amazon::Response::* object
will return one or more objects of class Net::Amazon::Property or
one of its subclasses, e.g. Net::Amazon::Property::Book or
Net::Amazon::Property::CD.
While Net::Amazon::Property objects expose accessors for all
fields returned in the XML response (like OurPrice(), ListPrice(),
Manufacturer(), Asin(), Catalog(), ProductName(), subclasses
might define their own accessors to more class-specific fields
(like the iNet::Amazon::Property::Book's authors() method returning
a list of authors, while Net::Amazon::Property's Authors() method
will return a reference to a sub-hash containing a Author field, just like
the response's XML contained it).
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 Method()
to retrieve the value or like Method($value) to set the value of the
field.
The item's ASIN number. This option is deprecated, please use ASIN.
The item's ASIN number.
Book title, CD album name or item name. This option is actually an alias for the method title, and is actually dependent upon the type of item returned.
Text string describing if the item is available. Examples:
"Usually ships within 24 hours" or
"Out of Print--Limited Availability".
Shows the catalog the item was found in: Book, Music, Classical,
Electronics etc.
Returns a sub-hash with a Author key, which points to either a single
$scalar or to a reference of an array containing author names as scalars.
Item's release date, format is "NN Monthname, Year".
Music label, publishing company or manufacturer
URL to a small (thumbnail) image of the item
URL to a medium-size image of the item
URL to a large image of the item
List price of the item
Amazon price of the item
Used price of the item
Unformatted list price as an integer, without currency symbol.
The currency code for the ListPrice(), e.g. USD.
Sales rank of the item (contains digits and commas, like 1,000,001)
Type of media (Paperback, etc.).
Number of media the item carries (1,2 CDs etc.).
Lengthy textual description of the product.
Lowest price in "Collectible" category.
Number of offerings in "Collectible" category.
Total number of offerings in all categories.
Number of offerings in "Used" category.
Number of offerings of the product.
Lowest price in "Third Party New" category.
Number of offerings in "Third Party New" category.
Return the width of the small image in pixels.
Return the height of the small image in pixels.
Return the width of the medium image in pixels.
Return the height of the medium image in pixels.
Return the width of the large image in pixels.
Return the height of the large image in pixels.
Boolean value that indicates if the product is eligible for super saver shipping.
The release year extracted from ReleaseDate().
Returns a list of browse nodes (text string categories) for this item.
Returns a list of ASINs of similar items for this item.
Please check the subclasses of Net::Amazon::Property for specialized
methods.
Mike Schilli, <m@perlmeister.com>
Copyright 2003 by Mike Schilli <m@perlmeister.com>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Net-Amazon documentation | Contained in the Net-Amazon distribution. |
###################################################################### package Net::Amazon::Property; ###################################################################### use warnings; use strict; use base qw(Net::Amazon); use Net::Amazon::Property::Book; use Net::Amazon::Property::CE; use Net::Amazon::Property::DigitalMusicTrack; use Net::Amazon::Property::DVD; use Net::Amazon::Property::Music; use Net::Amazon::Property::Software; use Net::Amazon::Property::VideoGames; use Net::Amazon::Attribute::ReviewSet; use Data::Dumper; use Log::Log4perl qw(:easy); # read: a poor man's XPath # NOTE: Igor Sutton Lopes has a module called Hash::Path that does exactly # what I am doing here. He beat me to the punch. :) our %DEFAULT_ATTRIBUTES_XPATH = ( Availability => [qw(Offers Offer OfferListing Availability)], Catalog => [qw(ItemAttributes ProductGroup)], Binding => [qw(ItemAttributes Binding)], CollectibleCount => [qw(OfferSummary TotalCollectible)], CollectiblePrice => [qw(OfferSummary LowestCollectiblePrice FormattedPrice)], ImageUrlLarge => [qw(LargeImage URL)], LargeImageUrl => [qw(LargeImage URL)], LargeImageWidth => [qw(LargeImage Width content)], LargeImageHeight => [qw(LargeImage Height content)], ListPrice => [qw(ItemAttributes ListPrice FormattedPrice)], Manufacturer => [qw(ItemAttributes Manufacturer)], MediumImageUrl => [qw(MediumImage URL)], ImageUrlMedium => [qw(MediumImage URL)], MediumImageWidth => [qw(MediumImage Width content)], MediumImageHeight => [qw(MediumImage Height content)], OurPrice => [qw(Offers Offer OfferListing Price FormattedPrice)], ImageUrlSmall => [qw(SmallImage URL)], SmallImageUrl => [qw(SmallImage URL)], SmallImageWidth => [qw(SmallImage Width content)], SmallImageHeight => [qw(SmallImage Height content)], SuperSaverShipping => [qw(Offers Offer OfferListing IsEligibleForSuperSaverShipping)], Title => [qw(ItemAttributes Title)], title => [qw(ItemAttributes Title)], ThirdPartyNewCount => [qw(OfferSummary TotalNew)], ThirdPartyNewPrice => [qw(OfferSummary LowestNewPrice FormattedPrice)], TotalOffers => [qw(Offers TotalOffers)], UsedCount => [qw(OfferSummary TotalUsed)], UsedPrice => [qw(OfferSummary LowestUsedPrice FormattedPrice)], RawListPrice => [qw(ItemAttributes ListPrice Amount)], CurrencyCode => [qw(ItemAttributes ListPrice CurrencyCode)], ReleaseDate => [qw(ItemAttributes ReleaseDate)], ); our @DEFAULT_ATTRIBUTES = qw( SalesRank ASIN DetailPageURL ProductDescription NumMedia NumberOfOfferings ); our %COMPATIBLE_ATTRIBUTES = ( 'Asin' => 'ASIN', 'url' => 'DetailPageURL', 'Media' => 'Binding', 'ProductName' => 'title', ); __PACKAGE__->make_accessor($_) for @DEFAULT_ATTRIBUTES; __PACKAGE__->make_accessor($_) for keys %DEFAULT_ATTRIBUTES_XPATH; __PACKAGE__->make_accessor($_) for qw(year review_set image_set offer_set); __PACKAGE__->make_array_accessor($_) for qw(browse_nodes similar_asins); __PACKAGE__->make_compatible_accessor($_, $COMPATIBLE_ATTRIBUTES{$_}) for keys %COMPATIBLE_ATTRIBUTES; ################################################## 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}); } for my $attr (keys %DEFAULT_ATTRIBUTES_XPATH) { my $value = __PACKAGE__->walk_hash_ref($options{xmlref}, $DEFAULT_ATTRIBUTES_XPATH{$attr}); $self->$attr($value); } if (defined $options{xmlref}->{OfferSummary}) { $self->NumberOfOfferings($self->UsedCount() + $self->ThirdPartyNewCount() + $self->CollectibleCount()); } if (defined $options{xmlref}->{EditorialReviews}) { $self->ProductDescription($options{xmlref}->{EditorialReviews}->{EditorialReview}->[0]->{Content}); } my @browse_nodes; if (ref $options{xmlref}->{BrowseNodes}->{BrowseNode} eq 'ARRAY') { for my $bn (@{$options{xmlref}->{BrowseNodes}->{BrowseNode}}) { push @browse_nodes, $bn->{Name}; # Walk the BrowseNode Ancestors and collect the other BrowseNode Ids for (my $ref = $bn->{Ancestors}->{BrowseNode}; defined $ref; $ref = $ref->{Ancestors}->{BrowseNode}) { # The BrowseNodeId is also available... push @browse_nodes, $ref->{Name}; } } } $self->browse_nodes(\@browse_nodes); my @similars; for my $similar (@{$options{xmlref}->{SimilarProducts}->{SimilarProduct}}) { # You could also capture the Title as well... push @similars, $similar->{ASIN}; } $self->similar_asins(\@similars); return $self; } ################################################## sub as_string { ################################################## my($self) = @_; my $result = "\"" . $self->Title . "\", "; if($self->{xmlref}->{Manufacturer}) { $result .= "$self->{xmlref}->{Manufacturer}, "; } $result .= $self->year() . ", " if $self->year(); $result .= $self->_best_effort_price() . ", "; $result .= $self->ASIN(); return $result; } ################################################## sub _best_effort_price { ################################################## my($self) = @_; my $price; if ($self->OurPrice()) { $price = $self->OurPrice(); } elsif ($self->ThirdPartyNewPrice()) { $price = $self->ThirdPartyNewPrice(); } elsif ($self->UsedPrice()) { $price = $self->UsedPrice(); } else { $price = '[$unknown]'; } return $price; } ################################################## 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->{ItemAttributes}->{ProductGroup}; 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); } elsif($catalog eq "Software") { DEBUG("Creating new Software Property"); $obj = Net::Amazon::Property::Software->new(xmlref => $xmlref); } elsif($catalog eq "Video Games") { DEBUG("Creating new Video Games Property"); $obj = Net::Amazon::Property::VideoGames->new(xmlref => $xmlref); } elsif($catalog eq "CE") { # Consumer Electronics? DEBUG("Creating new CE Property"); $obj = Net::Amazon::Property::CE->new(xmlref => $xmlref); } elsif($catalog eq "Digital Music Track") { DEBUG("Creating new Digital Music Track"); $obj = Net::Amazon::Property::DigitalMusicTrack->new(xmlref => $xmlref); } else { # print "UNKNOWN CATALOG: ", Data::Dumper::Dumper($xmlref), "\n"; # die "%Error: there is no property defined for type '$catalog'\n"; 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->{CustomerReviews}) { $reviewset->init_via_xmlref($xmlref->{CustomerReviews}); } $self->review_set($reviewset); } ################################################## ################################################## ################################################## 1; __END__