The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WebService::Technorati::CosmosApiQuery;
use strict;
use utf8;

use WebService::Technorati::ApiQuery;
use WebService::Technorati::LinkQuerySubject;
use WebService::Technorati::BlogLink;
use WebService::Technorati::Exception;
use base 'WebService::Technorati::ApiQuery';

use constant API_URI => '/cosmos';

BEGIN {
    use vars qw ($VERSION $DEBUG);
    $VERSION    = 0.04;
    $DEBUG       = 0;
}

sub new {
    my ($class, %params) = @_;
    if (! exists $params{'key'}) {
        WebService::Technorati::InstantiationException->throw(
            "WebService::Technorati::CosmosApiQuery must be " .
            "instantiated with at least 'key => theverylongkeystring'"); 
    }
    my $data = {};
    if (! exists $params{'url'}) {
        $data->{'needs_url'}++;
    }
    for my $k (keys %params) {
        $data->{'args'}{$k} = $params{$k};
    }
    my $self = bless ($data, ref ($class) || $class);
    return $self;
}

sub url {
    my $self = shift;
    my $url = shift;
    if ($url) {
        $self->{'url'} = $url;
        delete($self->{'needs_url'});
    }
    return $self->{'url'};
}

sub execute {
    my $self = shift;
    my $apiUrl = $self->apiHostUrl() . API_URI;
    if (exists $self->{'needs_url'}) {
        WebService::Technorati::StateValidationException->throw(
        "WebService::Technorati::AuthorinfoApiQuery must have a " .
        "'url' attribute set prior to query execution");
    }
    $self->SUPER::execute($apiUrl,$self->{'args'});
}

sub readResults {
    my $self = shift;
    my $result_xp = shift;
    my $error = $result_xp->find('/tapi/document/result/error');
    if ($error) {
        WebService::Technorati::DataException->throw($error);
    }
    my $nodeset = $result_xp->find("/tapi/document/result");
    my $node = $nodeset->shift;
    my $blogSubject = WebService::Technorati::LinkQuerySubject->new_from_node($node);
    $nodeset = $result_xp->find('/tapi/document/item');
    my @links = ();
    for my $node ($nodeset->get_nodelist) {
        my $blogLink = WebService::Technorati::BlogLink->new_from_node($node);
        push(@links, $blogLink);
    }
    $self->{'subject'} = $blogSubject;
    $self->{'links'} = \@links;

}


=head2 getLinkQuerySubject

 Usage     : getLinkQuerySubject();
 Purpose   : 
 Returns   : a scalar WebService::Technorati::LinkQuerySubject instance
 Argument  : none
 Throws    : none
 Comments  : the URL subject (blog or not) is returned with what 
             Technorati knows about it
See Also   : WebService::Technorati

=cut

sub getLinkQuerySubject {
    my $self = shift;
    return $self->{'subject'};
}

=head2 getInboundLinks

 Usage     : getInboundLinks();
 Purpose   : 
 Returns   : an array of WebService::Technorati::BlogLink instances
 Argument  : none
 Throws    : none
 Comments  : the list of inbound links are returned with what Technorati knows
             about them
See Also   : WebService::Technorati

=cut

sub getInboundLinks {
    my $self = shift;
    return (wantarray) ? @{$self->{'links'}} : $self->{'links'};
}

1;