Catalyst::Model::ISBNDB - Provide Catalyst access to isbndb.com


Catalyst-Model-ISBNDB documentation Contained in the Catalyst-Model-ISBNDB distribution.

Index


Code Index:

NAME

Top

Catalyst::Model::ISBNDB - Provide Catalyst access to isbndb.com

SYNOPSIS

Top

    package MyApp::Model::ISBNDB;
    use base 'Catalyst::Model::ISBNDB';

    __PACKAGE__->config(access_key => 'XXX');

    # Within a Catalyst application:
    my $book = $c->model('ISBNDB')->find_book($isbn);

DESCRIPTION

Top

This package provides a Catalyst model that makes requests of the isbndb.com web service, using their published REST interface. The model creates an instance of the WebService::ISBNDB::API class and uses it as a factory for making requests for data in any of the classes supported (Authors, Books, Categories, Publishers and Subjects).

CONFIGURATION

Top

The model requires the application to configure a valid access key from the isbndb.com service:

    __PACKAGE__->config(access_key => $KEY)

No other configuration is needed. If you choose to load and manipulate the WebService::ISBNDB::API class directly, you may also use the set_default_api_key method of that class to set your access key.

METHODS

Top

The following methods are available to users or sub-classes:

find_author($ID)
find_book($ISBN|$ID)
find_category($ID)
find_publisher($ID)
find_subject($ID)

Find a single record of the respective type, using the ID. When searching for a book, the ISBN may be specified instead of an ID. Returns the matching object, undef if no match is found, or throws an exception if an error occurs.

search_authors($ARGS)
search_books($ARGS)
search_categories($ARGS)
search_publishers($ARGS)
search_subjects($ARGS)

Perform a search for the respective type of records. The parameter is a hash-reference of search terms, as defined in the corresponding manual pages for the types that derive from WebService::ISBNDB::API. The return value is a WebService::ISBNDB::Iterator instance. An exception is thrown on error.

get_agent

This method is called by the previous methods to retrieve the internal API factory agent. If one has not yet been created, it is first created and then returned.

allocate_agent($CONFIG)

The first time get_agent() is called, it calls this method to allocate an instance of WebService::ISBNDB::API. The single parameter is the configuration information from Catalyst. This is used to look up the access key that would have been configured when the application started. The return value is either an API object instance, or an exception is thrown to signal an error.

CAVEATS

Top

In order to access the isbndb.com service, you must register on their site and create an API access key.

SEE ALSO

Top

WebService::ISBNDB::API, WebService::ISBNDB::Iterator

BUGS

Top

Please report any bugs or feature requests to bug-catalyst-model-isbndb at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Catalyst-Model-ISBNDB. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Catalyst-Model-ISBNDB

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Catalyst-Model-ISBNDB

* CPAN Ratings

http://cpanratings.perl.org/d/Catalyst-Model-ISBNDB

* Search CPAN

http://search.cpan.org/dist/Catalyst-Model-ISBNDB

* Source code on GitHub

http://github.com/rjray/catalyst-model-isbndb/tree/master

COPYRIGHT & LICENSE

Top

AUTHOR

Top

Randy J. Ray <rjray@blackperl.com>


Catalyst-Model-ISBNDB documentation Contained in the Catalyst-Model-ISBNDB distribution.

###############################################################################
#
# This file copyright (c) 2008-2009 by Randy J. Ray, all rights reserved
#
# Copying and distribution are permitted under the terms of the Artistic
# License 2.0 (http://www.opensource.org/licenses/artistic-license-2.0.php) or
# the GNU LGPL (http://www.opensource.org/licenses/lgpl-license.php).
#
###############################################################################
#
#   Description:    A Catalyst model for providing access to the isbndb.com
#                   web service.
#
#   Functions:      get_agent
#                   allocate_agent
#
#   Libraries:      WebService::ISBNDB::API
#                   NEXT
#
#   Global Consts:  $VERSION
#
###############################################################################

package Catalyst::Model::ISBNDB;

use 5.008;
use strict;
use warnings;
use vars qw($VERSION);
use base 'Catalyst::Model';

use NEXT;
use WebService::ISBNDB::API;

$VERSION = '0.12';
$VERSION = eval $VERSION;  ## no critic

BEGIN
{
	# Don't let Perl::Critic whinge about this; I don't want to add
	# Sub::Installer to my deps list...
    no strict 'refs'; ## no critic

    my %map = ( Authors    => 'author',
                Books      => 'book',
                Categories => 'category',
                Publishers => 'publisher',
                Subjects   => 'subject' );

    for my $method (keys %map)
    {
        my $name = "find_$map{$method}";
        *$name = sub
            {
                my ($self, $id) = @_;

                my $api = $self->get_agent;
                my $obj;
                eval { $obj = $api->find($method => $id); };
                die "$@" if $@;

                $obj;
            };

        $name = 'search_' . lc $method;
        *$name = sub
            {
                my ($self, $args) = @_;

                my $api = $self->get_agent;
                my $iter;
                eval { $iter = $api->search($method => $args); };
                die "$@" if $@;

                $iter;
            };
    }
}

###############################################################################
#
#   Sub Name:       get_agent
#
#   Description:    Get the agent from the config for this class. If none has
#                   been set yet, thread through to the allocation of one.
#
#   Arguments:      NAME      IN/OUT  TYPE      DESCRIPTION
#                   $self     in      ref       Object
#
#   Returns:        Success:    agent instance
#                   Failure:    dies
#
###############################################################################
sub get_agent
{
    my $self = shift;
    my $config = $self->config;

    $config->{agent} || $self->allocate_agent($config);
}

###############################################################################
#
#   Sub Name:       allocate_agent
#
#   Description:    Allocate an agent. Store it on the config and return the
#                   new object. Uses the value from calling
#                   WebService::ISBNDB::API::get_default_agent().
#
#   Arguments:      NAME      IN/OUT  TYPE      DESCRIPTION
#                   $self     in      ref       Object
#                   $config   in      hashref   The config info for this class
#                                                 (it was already available)
#
#   Returns:        Success:    new agent
#                   Failure:    dies
#
###############################################################################
sub allocate_agent
{
    my ($self, $config) = @_;

    my $key = $config->{access_key} ||
        WebService::ISBNDB::API->get_default_api_key;

    $config->{agent} = WebService::ISBNDB::API->new({ api_key => $key });
}

1;