作ってみた

WebSearvice::RakuAPI

package WebService::RakuAPI;
use strict;
use warnings;

use WebService::RakuAPI::Result;
use LWP::UserAgent;
use XML::TreePP;
use Carp qw(croak);

sub new { bless {}, shift; }

sub search {
  my $self = shift;
  my $option = shift;

  my $req_url = $self->create_req_url($option);
  my $xml = $self->get_xml($req_url);
  my @results = $self->parse_xml($xml);

  return @Result;
}

sub create_req_url {
  my $self = shift;
  my $option = shift;

  foreach ( qw/keyword query q/ ) {
    croak qq/keyword is required/ unless ( $option->{$_} );
  }
	
  my @params;
  foreach ( keys %{$option} ) {
    my $param = $_ . $option->{$_};
    push  @params, $param;
  }
	
  my $base_url = 'http://rakuapi.ddo.jp/api?';
  my $req_url = $base_url . join('&', @params);

  return $req_url;
}

sub get_xml {
  my $self = shift;
  my $req_url = shift;

  my $response = LWP::UserAgent->new->get($req_url);
  croak qq/Couldn't connect $req_url/ unless ( $response->is_success );
	
  my $xml = $response->content;
	
  return $xml;
}

sub parse_xml {
  my $self = shift;
  my $xml = shift;
	
  my $tpp = XML::TreePP->new;
  my $parsed_xml = $tpp->parse($xml);
	
  my @results;
  forearch my $result ( @{$parsed_xml->{ResultSet}->{result}} ) {
    push @results, WebService::RakuAPI::Result->new($result);
  }

  return @results;
}

WebService::RakuAPI::Result

package WebService::RakuAPI::Result;
use strict;
use warnings;

use base qw(Class::Accessor::Fast);

sub new {
  my $class = shift;
  my $result = shift;

  $class->mk_accessors(keys %{$result});

  return $class->SUPER::new($result);
}

ちょうてきとう。
とりあえずXMLのみ。
見直しとかは明日やろう。