Index: lang/perl/WebService-Simple/tags/release-0.05/t/02_parser.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/02_parser.t (revision 10072)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/02_parser.t (revision 10072)
@@ -0,0 +1,25 @@
+use strict;
+use Test::More (tests => 3);
+
+BEGIN
+{
+    use_ok("WebService::Simple");
+}
+
+
+{
+    my $service = WebService::Simple->new(
+        base_url => "http://example.com/api",
+    );
+
+    isa_ok( $service->{response_parser}, "WebService::Simple::Parser::XML::Simple" );
+}
+
+{
+    my $service = WebService::Simple->new(
+        base_url => "http://example.com/api",
+        response_parser => 'JSON'
+    );
+
+    isa_ok( $service->{response_parser}, "WebService::Simple::Parser::JSON" );
+}
Index: lang/perl/WebService-Simple/tags/release-0.05/t/00_load.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/00_load.t (revision 10071)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/00_load.t (revision 10071)
@@ -0,0 +1,6 @@
+use strict;
+use Test::More tests => 1;
+
+use_ok( 'WebService::Simple' );
+
+diag( "Testing WebService::Simple $WebService::Simple::VERSION" );
Index: lang/perl/WebService-Simple/tags/release-0.05/t/01_basic.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/01_basic.t (revision 10071)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/01_basic.t (revision 10071)
@@ -0,0 +1,74 @@
+use strict;
+use Test::More;
+
+my ($flickr_api_key);
+BEGIN
+{
+    $flickr_api_key = $ENV{FLICKR_API_KEY};
+    if (! $flickr_api_key ) {
+        plan( skip_all => "Please set FLICKR_API_KEY to enable this test" );
+    } else {
+        plan( tests => 13 );
+    }
+
+    use_ok("WebService::Simple");
+}
+
+{
+    my $simple = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        params   => {
+            api_key => $flickr_api_key
+        }
+    );
+
+    ok($simple, "object created ok");
+    isa_ok( $simple, "WebService::Simple", "object isa WebService::Simple" );
+    ok( $simple->response_parser, "parser ok" );
+    isa_ok( $simple->response_parser, "WebService::Simple::Parser::XML::Simple", "parser isa WebService::Simple::Parser::XML::Simple" );
+
+    my $response = $simple->get( { method => "flickr.test.echo", name => "value" } );
+
+    ok( $response );
+    isa_ok( $response, "WebService::Simple::Response" );
+
+    my $h = $response->parse_response;
+    ok($h);
+    isa_ok($h, 'HASH');
+
+    is( $h->{name}, 'value' );
+
+    # Make sure the response is NOT cached by default
+    {
+        my $tmp = $simple->get( { method => "flickr.test.echo", name => "value" } );
+        isnt( $tmp, $response, "response is NOT cached ($response <=> $tmp)" );
+    }
+}
+
+SKIP: {
+    eval { require Cache::Memory };
+    if ($@) {
+        skip(2, "Cache::Memory not installed");
+    }
+
+    my $called = 0;
+    my $simple = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        params   => {
+            api_key => $flickr_api_key
+        },
+        cache => {
+            module => 'Cache::Memory',
+        }
+    );
+
+    my $response;
+    for (1..3) {
+        my $tmp = $simple->get( { method => "flickr.test.echo", name => "value" } );
+        if ($response) {
+            is( $tmp, $response, "got cached $response" );
+        } else {
+            $response = $tmp;
+        }
+    }
+}
Index: lang/perl/WebService-Simple/tags/release-0.05/t/pod.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/pod.t (revision 10286)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/pod.t (revision 10286)
@@ -0,0 +1,4 @@
+use Test::More;
+eval "use Test::Pod 1.14";
+plan skip_all => "Test::Pod 1.14 required for testing POD" if $@;
+all_pod_files_ok();
Index: lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_libxml.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_libxml.t (revision 10282)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_libxml.t (revision 10282)
@@ -0,0 +1,40 @@
+use strict;
+use Test::More;
+
+my $flickr_api_key = $ENV{FLICKR_API_KEY};
+BEGIN
+{
+    eval { require XML::LibXML };
+    if ($@) {
+        plan(skip_all => "XML::LibXML not installed");
+    } else {
+        plan(tests => 7);
+    }
+    use_ok("WebService::Simple");
+}
+
+{
+    my $service = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        response_parser => 'XML::LibXML',
+        params   => {
+            api_key => $flickr_api_key
+        }
+    );
+    isa_ok( $service->response_parser, "WebService::Simple::Parser::XML::LibXML");
+
+    SKIP: {
+        if (! $flickr_api_key ) {
+            skip( "Please set FLICKR_API_KEY to enable this test", 5 );
+        }
+    
+        my $response = $service->get( { method => "flickr.test.echo", name => "value" } );
+        my $xml = $response->parse_response;
+    
+        isa_ok( $xml, 'XML::LibXML::Document' );
+        is( $xml->findvalue( '/rsp/@stat' ), 'ok', '/rsp/@stat' );
+        is( $xml->findvalue( '/rsp/api_key' ), $flickr_api_key, '/rsp/api_key', );
+        is( $xml->findvalue( '/rsp/name' ), "value", '/rsp/name' );
+        is( $xml->findvalue( '/rsp/method' ), 'flickr.test.echo', '/rsp/method' );
+    }
+}
Index: lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_json.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_json.t (revision 10118)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_json.t (revision 10118)
@@ -0,0 +1,47 @@
+use strict;
+use Test::More ( tests => 4 );
+
+my $flickr_api_key = $ENV{FLICKR_API_KEY};
+BEGIN
+{
+    use_ok("WebService::Simple");
+}
+
+{
+    my $service = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        response_parser => 'JSON',
+        params   => {
+            api_key => $flickr_api_key
+        }
+    );
+
+    isa_ok( $service->response_parser, "WebService::Simple::Parser::JSON");
+
+    SKIP: {
+        if (! $flickr_api_key ) {
+            skip( "Please set FLICKR_API_KEY to enable this test", 2 );
+        }
+    
+        my $response = $service->get( { method => "flickr.test.echo", name => "value", format => "json" } );
+
+        # XXX - This is a hack. Flickr returns values as JSONP construct,
+        # not as a pure JSON. for our parse_response() to work properly,
+        # we need to fix the result first
+        ${ $response->content_ref } =~ s/jsonFlickrApi\((.+)\)/$1/;
+
+        my $json = $response->parse_response;
+    
+        isa_ok( $json, 'HASH' );
+        is_deeply(
+            $json,
+            {
+                'name' => { _content => 'value' },
+                'method' => { _content => 'flickr.test.echo' },
+                'api_key' => { _content => $flickr_api_key },
+                'stat' => 'ok',
+                'format' => { _content => 'json' },
+            }
+        );
+    }
+}
Index: lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_xml_simple.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_xml_simple.t (revision 10117)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/02_parser_xml_simple.t (revision 10117)
@@ -0,0 +1,39 @@
+use strict;
+use Test::More ( tests => 4 );
+
+my $flickr_api_key = $ENV{FLICKR_API_KEY};
+BEGIN
+{
+    use_ok("WebService::Simple");
+}
+
+{
+    my $service = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        params   => {
+            api_key => $flickr_api_key
+        }
+    );
+
+    isa_ok( $service->response_parser, "WebService::Simple::Parser::XML::Simple");
+
+    SKIP: {
+        if (! $flickr_api_key ) {
+            skip( "Please set FLICKR_API_KEY to enable this test", 2 );
+        }
+    
+        my $response = $service->get( { method => "flickr.test.echo", name => "value" } );
+        my $xml = $response->parse_response;
+    
+        isa_ok( $xml, 'HASH' );
+        is_deeply(
+            $xml,
+            {
+                'name' => 'value',
+                'method' => 'flickr.test.echo',
+                'api_key' => $flickr_api_key,
+                'stat' => 'ok'
+            }
+        );
+    }
+}
Index: lang/perl/WebService-Simple/tags/release-0.05/t/pod-coverage.t
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/t/pod-coverage.t (revision 10284)
+++ lang/perl/WebService-Simple/tags/release-0.05/t/pod-coverage.t (revision 10284)
@@ -0,0 +1,4 @@
+use Test::More;
+eval "use Test::Pod::Coverage 1.04";
+plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" if $@;
+all_pod_coverage_ok()
Index: lang/perl/WebService-Simple/tags/release-0.05/MANIFEST
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/MANIFEST (revision 10296)
+++ lang/perl/WebService-Simple/tags/release-0.05/MANIFEST (revision 10296)
@@ -0,0 +1,23 @@
+.shipit
+Changes
+example/flickr_echo.pl
+example/flickr_search.pl
+example/lingr.pl
+lib/WebService/Simple.pm
+lib/WebService/Simple/Parser.pm
+lib/WebService/Simple/Parser/JSON.pm
+lib/WebService/Simple/Parser/XML/LibXML.pm
+lib/WebService/Simple/Parser/XML/Simple.pm
+lib/WebService/Simple/Response.pm
+Makefile.PL
+MANIFEST
+META.yml
+README
+t/00_load.t
+t/01_basic.t
+t/02_parser.t
+t/02_parser_json.t
+t/02_parser_libxml.t
+t/02_parser_xml_simple.t
+t/pod-coverage.t
+t/pod.t
Index: lang/perl/WebService-Simple/tags/release-0.05/META.yml
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/META.yml (revision 10296)
+++ lang/perl/WebService-Simple/tags/release-0.05/META.yml (revision 10296)
@@ -0,0 +1,30 @@
+---
+abstract: 'Simple Interface To Web Services APIs'
+author: 'Yusuke Wada  C<< <yusuke@kamawada.com> >>'
+build_requires:
+  Test::More: 0
+  Test::Pod: 0
+distribution_type: module
+generated_by: 'Module::Install version 0.67'
+license: perl
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.3.html
+  version: 1.3
+name: WebService-Simple
+no_index:
+  directory:
+    - inc
+    - t
+recommends:
+  XML::LibXML: 0
+requires:
+  Class::Accessor::Fast: 0
+  Class::Data::ConfigHash: 0
+  Class::Inspector: 0
+  Data::Dumper: 0
+  Digest::MD5: 0
+  JSON: 2.0
+  LWP::UserAgent: 0
+  UNIVERSAL::require: 0
+  XML::Simple: 0
+version: 0.04
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple.pm (revision 10302)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple.pm (revision 10302)
@@ -0,0 +1,333 @@
+# $Id$
+
+package WebService::Simple;
+use strict;
+use warnings;
+use base qw(LWP::UserAgent Class::Data::ConfigHash);
+use Class::Inspector;
+use Data::Dumper ();
+use Digest::MD5 ();
+use WebService::Simple::Response;
+use UNIVERSAL::require;
+
+our $VERSION = '0.05';
+
+__PACKAGE__->config(
+    base_url => '',
+    response_parser => {
+        module => "XML::Simple"
+    },
+);
+
+sub new
+{
+    my $class = shift;
+    my %args  = @_;
+    my $base_url     = delete $args{base_url} ||
+        $class->config->{base_url} ||
+        Carp::croak("base_url is required");
+    my $basic_params = delete $args{params} || delete $args{param} || {};
+    my $response_parser = delete $args{response_parser} ||
+        $class->config->{response_parser};
+    if (! $response_parser || ! eval { $response_parser->isa('WebService::Simple::Parser') }) {
+        my $config = $response_parser || $class->config->{response_parser};
+        if (! ref $config) {
+            $config = { module => $config };
+        }
+        my $module = $config->{module};
+        if ($module !~ s/^\+//) {
+            $module = __PACKAGE__ . "::Parser::$module";
+        }
+        if (! Class::Inspector->loaded($module)) {
+            $module->require or die;
+        }
+        $response_parser = $module->new( %{ $config->{args} || {} } );
+    };
+
+    my $cache = delete $args{cache};
+    if (! $cache || ref $cache eq 'HASH') {
+        my $config = ref $cache eq 'HASH' ? $cache : $class->config->{cache};
+        if ($config) {
+            if (! ref $config) {
+                $config = { module => $config };
+            }
+
+            my $module = $config->{module};
+            if (! Class::Inspector->loaded($module)) {
+                $module->require or die;
+            }
+            $cache = $module->new( $config->{hashref_args} ? $config->{args} : %{ $config->{args} } );
+        }
+    }
+
+    my $self = $class->SUPER::new(%args);
+    $self->{base_url} = URI->new($base_url);
+    $self->{basic_params} = $basic_params;
+    $self->{response_parser} = $response_parser;
+    $self->{cache} = $cache;
+    return $self;
+}
+
+sub base_url { $_[0]->{base_url} }
+sub basic_params { $_[0]->{basic_params} }
+sub response_parser { $_[0]->{response_parser} }
+sub cache { $_[0]->{cache} }
+
+sub __cache_get
+{
+    my $self  = shift;
+    my $cache = $self->cache;
+    return unless $cache;
+
+    my $key   = $self->__cache_key( shift );
+    return $cache->get( $key, @_ );
+}
+
+sub __cache_set
+{
+    my $self  = shift;
+    my $cache = $self->cache;
+    return unless $cache;
+
+    my $key   = $self->__cache_key( shift );
+    return $cache->set( $key, @_ );
+}
+
+sub __cache_remove
+{
+    my $self  = shift;
+    my $cache = $self->cache;
+    return unless $cache;
+
+    my $key   = $self->__cache_key( shift );
+    return $cache->remove( $key, @_ );
+}
+
+sub __cache_key
+{
+    my $self  = shift;
+    local $Data::Dumper::Indent   = 1;
+    local $Data::Dumper::Terse    = 1;
+    local $Data::Dumper::Sortkeys = 1;
+    return Digest::MD5::md5_hex( Data::Dumper::Dumper( $_[0] ) );
+}
+
+sub get
+{
+    my $self = shift;
+    my ($url, %extra, @headers);
+    if (ref $_[0] eq 'HASH') {
+        %extra = %{shift @_};
+    } else {
+        $url = shift @_;
+        if (ref $_[0] eq 'HASH') {
+            %extra = %{ shift @_ }
+        }
+    }
+
+    @headers = @_;
+
+    my $uri = URI->new($self->base_url);
+    $uri->path( $uri->path . $url) if $url;
+
+    # The url must be initialized with default parameters.
+
+    $uri->query_form( %{$self->basic_params}, %extra );
+
+    my $response;
+
+    $response = $self->__cache_get([$uri, @headers]);
+    if ($response) {
+        return $response;
+    }
+
+    $response = $self->SUPER::get($uri, @headers);
+    if (! $response->is_success) {
+        Carp::croak("request to $url failed");
+    }
+
+    $response = WebService::Simple::Response->new_from_response(
+        response => $response,
+        parser   => $self->response_parser
+    );
+    $self->__cache_set([$uri, @headers], $response);
+    return $response;
+
+}
+
+sub post
+{
+    my ($self, $url, @params) = @_;
+
+    my $uri = URI->new($self->base_url);
+    $uri->path( $uri->path . $url) if $url;
+
+    # default parameters must come *before* @params, so unshift instead
+    # of push
+    unshift @params, %{ $self->basic_params };
+    my $response = $self->SUPER::post($uri, @params );
+
+    if (! $response->is_success) {
+        Carp::croak("request to $url failed: " . $response->status_line);
+    }
+    $response = WebService::Simple::Response->new_from_response(
+        response => $response,
+        parser   => $self->response_parser
+    );
+    return $response;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+WebService::Simple - Simple Interface To Web Services APIs
+
+=head1 SYNOPSIS
+
+  use WebService::Simple;
+
+  # Simple use case
+  my $flickr = WebService::Simple->new(
+    base_url => "http://api.flickr.com/services/rest/",
+    param    => { api_key => "your_api_key", }
+  );
+
+  # send GET request to 
+  # http://api.flickr.com/service/rest/?api_key=your_api_key&method=flickr.test.echo&name=value
+  $flickr->get( { method => "flickr.test.echo", name => "value" } );
+
+  # send GET request to 
+  # http://api.flickr.com/service/rest/extra/path?api_key=your_api_key&method=flickr.test.echo&name=value
+  $flickr->get( "extra/path",
+    { method => "flickr.test.echo", name => "value" });
+
+=head1 DESCRIPTION
+
+WebService::Simple is a simple class to interact with web services.
+
+It's basically an LWP::UserAgent that remembers recurring api URLs and
+parameters, plus sugar to parse the results.
+
+=head1 METHODS
+
+=over 4
+
+=item new(I<%args>)
+
+    my $flickr = WebService::Simple->new(
+        base_url => "http://api.flickr.com/services/rest/",
+        param    => { api_key => "your_api_key", }
+    );
+
+Create and return a new WebService::Simple object.
+"new" Method requires a base_url of Web Service API.
+
+=item get(I<[$extra_path,] $args>)
+
+    my $response =
+      $flickr->get( { method => "flickr.test.echo", name => "value" } );
+
+Send GET request, and you can get  the WebService::Simple::Response object.
+If you want to add a path to base URL, use an option parameter.
+
+    my $lingr = WebService::Simple->new(
+        base_url => "http://www.lingr.com/",
+        param    => { api_key => "your_api_key", format => "xml" }
+    );
+    my $response = $lingr->get( 'api/session/create', {} );
+
+=item post(I<[$extra_path,] $args>)
+
+Send POST request.
+
+=item base_url
+
+=item basic_params
+
+=item cache
+
+=item response_parser
+
+=back
+
+=head1 SUBCLASSING
+
+For better encapsulation, you can create subclass of WebService::Simple to
+customize the behavior
+
+  package WebService::Simple::Flickr;
+  use base qw(WebService::Simple);
+  __PACKAGE__->config(
+    base_url => "http://api.flickr.com/services/rest/",
+    upload_url => "http://api.flickr.com/services/upload/",
+  );
+
+  sub test_echo
+  {
+    my $self = shift;
+    $self->get( { method => "flickr.test.echo", name => "value" } );
+  }
+
+  sub upload
+  {
+    my $self = shift;
+    local $self->{base_url} = $self->config->{upload_url};
+    $self->post( 
+      Content_Type => "form-data",
+      Content => { title => "title", description => "...", photo => ... },
+    );
+  }
+
+
+=head1 PARSERS
+
+Web services return their results in various different formats. Or perhaps
+you require more sophisticated results parsing than what WebService::Simple
+provides.
+
+WebService::Simple by default uses XML::Simple, but you can easily override
+that by providing a parser object to the constructor:
+
+  my $service = WebService::Simple->new(
+    response_parser => AVeryComplexParser->new,
+    ...
+  );
+  my $response = $service->get( ... );
+  my $thing = $response->parse_response;
+
+This allows great flexibility in handling different webservices
+
+=head1 CACHING
+
+You can cache the response of Web Service by using Cache object.
+
+  my $cache   = Cache::File->new(
+      cache_root      => '/tmp/mycache',
+      default_expires => '30 min',
+  );
+  
+  my $flickr = WebService::Simple->new(
+      base_url => "http://api.flickr.com/services/rest/",
+      cache    => $cache,
+      param    => { api_key => "your_api_key, }
+  );
+
+
+=head1 AUTHOR
+
+Yusuke Wada  C<< <yusuke@kamawada.com> >>
+
+Daisuke Maki C<< <daisuke@endeworks.jp> >>
+
+Matsuno Tokuhiro
+
+=head1 COPYRIGHT AND LICENSE
+
+This module is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+See L<perlartistic>.
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser.pm (revision 10287)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser.pm (revision 10287)
@@ -0,0 +1,22 @@
+package WebService::Simple::Parser;
+use strict;
+use warnings;
+use base qw(Class::Accessor::Fast);
+
+sub parse_response {}
+
+1;
+
+__END__
+
+=head1 NAME
+
+WebService::Simple::Parser - Base Parser Class
+
+=head1 METHODS
+
+=head2 parse_response($response)
+
+Parses the response object. Your subclass must implement this method
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Response.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Response.pm (revision 10299)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Response.pm (revision 10299)
@@ -0,0 +1,65 @@
+# $Id$
+
+package WebService::Simple::Response;
+use strict;
+use warnings;
+use base qw(HTTP::Response);
+
+our $version = "0.02";
+
+sub new_from_response
+{
+    # XXX hack. This probably should be changed...
+    my $class = shift;
+    my %args  = @_;
+    my $self = bless $args{response}, $class;
+    $self->{__parser} = $args{parser};
+    return $self;
+}
+
+sub parse_response
+{
+    my $self = shift;
+    return $self->{__parser}->parse_response($self);
+}
+
+*parse_xml = \&parse_response;
+
+1;
+
+__END__
+
+=head1 NAME
+
+Webservice::Simple::Response - Adds a parse_response() to HTTP::Response
+
+=head1 SYNOPSIS
+
+  # Internal use only
+
+=head1 METHODS
+
+=head2 new_from_response
+
+=head2 parse_response
+
+Parses the response content using the specified parser
+
+=head2 parse_xml
+
+This is a n alias for parse_response() for backwards compatibility.
+Use parse_response instead.
+
+=head1 AUTHOR
+
+Yusuke Wada  C<< <yusuke@kamawada.com> >>
+
+Daisuke Maki C<< <daisuke@endeworks.jp> >>
+
+=head1 COPYRIGHT AND LICENSE
+
+This module is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+See L<perlartistic>.
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/LibXML.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/LibXML.pm (revision 10287)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/LibXML.pm (revision 10287)
@@ -0,0 +1,46 @@
+package WebService::Simple::Parser::XML::LibXML;
+use strict;
+use warnings;
+use base qw(WebService::Simple::Parser);
+use XML::LibXML;
+
+__PACKAGE__->mk_accessors($_) for qw(libxml);
+
+sub new
+{
+    my $class = shift;
+    my $args  = shift || {};
+    $args->{libxml} ||= XML::LibXML->new;
+    $class->SUPER::new($args);
+}
+
+sub parse_response
+{
+    my $self = shift;
+    $self->libxml->parse_string( $_[0]->content );
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+WebService::Simple::Parser::XML - Parse XML content using XML::LibXML
+
+=head1 SYNOPSIS
+
+  my $service = WebService::Simple->new(
+    base_url => ...,
+    response_parser => 'XML::LibXML',
+  );
+  my $res = $service->get(...);
+  my $dom = $res->parse_response();
+
+=head1 METHODS
+
+=head2 new
+
+=head2 parse_response
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/Simple.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/Simple.pm (revision 10287)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/XML/Simple.pm (revision 10287)
@@ -0,0 +1,26 @@
+# $Id$
+
+package WebService::Simple::Parser::XML::Simple;
+use strict;
+use warnings;
+use base qw(WebService::Simple::Parser);
+use XML::Simple;
+
+sub parse_response
+{
+    return XMLin($_[1]->content);
+}
+
+1;
+
+__END__
+
+=head1 NAME 
+
+WebService::Simple::Parser::XML::Simple - XML::Simple Adaptor For WebService::Simple::Parser
+
+=head1 METHODS
+
+=head2 parse_response
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/JSON.pm
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/JSON.pm (revision 10287)
+++ lang/perl/WebService-Simple/tags/release-0.05/lib/WebService/Simple/Parser/JSON.pm (revision 10287)
@@ -0,0 +1,49 @@
+# $Id$
+
+package WebService::Simple::Parser::JSON;
+use strict;
+use warnings;
+use base qw(WebService::Simple::Parser);
+use JSON 2.0;
+
+sub new
+{
+    my $class = shift;
+    my %args  = @_;
+
+    my $json  = delete $args{json} || JSON->new;
+    my $self  = $class->SUPER::new(%args);
+    $self->{json} = $json;
+    return $self;
+}
+
+sub parse_response
+{
+    my $self = shift;
+    $self->{json}->decode( $_[0]->content );
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+WebService::Simple::Parser::JSON - Parse JSON content
+
+=head1 SYNOPSIS
+
+  my $service = WebService::Simple->new(
+    base_url => ...,
+    response_parser => 'JSON',
+  );
+  my $res = $service->get(...);
+  my $json = $res->parse_response();
+
+=head1 METHODS
+
+=head2 new
+
+=head2 parse_response
+
+=cut
Index: lang/perl/WebService-Simple/tags/release-0.05/Makefile.PL
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/Makefile.PL (revision 10296)
+++ lang/perl/WebService-Simple/tags/release-0.05/Makefile.PL (revision 10296)
@@ -0,0 +1,24 @@
+use strict;
+use inc::Module::Install;
+
+name('WebService-Simple');
+all_from('lib/WebService/Simple.pm');
+
+requires( 'Class::Accessor::Fast' );
+requires( 'Class::Data::ConfigHash' );
+requires( 'Class::Inspector' );
+requires( 'Data::Dumper' );
+requires( 'Digest::MD5' );
+requires( 'JSON', '2.0' );
+requires( 'LWP::UserAgent' );
+requires( 'UNIVERSAL::require' );
+requires( 'XML::Simple' );
+
+recommends( 'XML::LibXML' );
+
+build_requires( 'Test::More' );
+build_requires( 'Test::Pod' );
+build_requires( 'Pod::Coverage' );
+
+auto_include;
+WriteAll;
Index: lang/perl/WebService-Simple/tags/release-0.05/Changes
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/Changes (revision 10302)
+++ lang/perl/WebService-Simple/tags/release-0.05/Changes (revision 10302)
@@ -0,0 +1,11 @@
+Revision history for WebService-Simple
+0.05  Fri Apr 24 16:08:00 2008
+       - Fixed typo
+0.04  Fri Apr 24 15:42:00 2008
+       - LWP::UserAgent base
+0.03  Fri Apr 04 15:41:00 2008
+       - Fixed Makefile.PL and Build.PL
+0.02  Thu Apr 03 16:13:00 2008
+       - Added CHACHING
+0.01  Thu Mar 27 10:06:09 2008
+       - original version
Index: lang/perl/WebService-Simple/tags/release-0.05/example/flickr_echo.pl
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/example/flickr_echo.pl (revision 10275)
+++ lang/perl/WebService-Simple/tags/release-0.05/example/flickr_echo.pl (revision 10275)
@@ -0,0 +1,16 @@
+use strict;
+use warnings;
+use WebService::Simple;
+use Data::Dumper;
+
+my $api_key = $ARGV[0] || "your_api_key";
+
+my $flickr = WebService::Simple->new(
+    base_url => "http://api.flickr.com/services/rest/",
+    param    => { api_key => $api_key, }
+);
+
+my $response =
+  $flickr->get( { method => "flickr.test.echo", name => "value" } );
+my $ref = $response->parse_response;
+print Dumper $ref;
Index: lang/perl/WebService-Simple/tags/release-0.05/example/lingr.pl
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/example/lingr.pl (revision 10275)
+++ lang/perl/WebService-Simple/tags/release-0.05/example/lingr.pl (revision 10275)
@@ -0,0 +1,43 @@
+use strict;
+use warnings;
+use WebService::Simple;
+
+my $api_key = $ARGV[0] || "your_api_key";
+my $room_id = "hO4SmQWTdJ4";    # http://www.lingr.com/room/hO4SmQWTdJ4
+my $nickname = "lingr.pl";
+my $message  = "Hello, World.";
+
+my $lingr = WebService::Simple->new(
+    base_url => 'http://www.lingr.com/',
+    param    => { api_key => $api_key, format => 'xml' }
+);
+
+# create session, get session
+my $response;
+$response = $lingr->get( 'api/session/create', {} );
+my $session = $response->parse_response->{session};
+
+# enter the room, get ticket
+$response = $lingr->get(
+    'api/room/enter',
+    {
+        session  => $session,
+        id       => $room_id,
+        nickname => $nickname,
+    },
+);
+my $ticket = $response->parse_response->{ticket};
+
+# say 'Hello, World'
+$response = $lingr->get(
+    'api/room/say',
+    {
+        session => $session,
+        ticket  => $ticket,
+        message => $message,
+    },
+);
+my $status = $response->parse_response->{status};
+
+# destroy session
+$lingr->get( 'api/session/destroy', { session => $session, } );
Index: lang/perl/WebService-Simple/tags/release-0.05/example/flickr_search.pl
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/example/flickr_search.pl (revision 10275)
+++ lang/perl/WebService-Simple/tags/release-0.05/example/flickr_search.pl (revision 10275)
@@ -0,0 +1,17 @@
+use strict;
+use warnings;
+use WebService::Simple;
+use Data::Dumper;
+use utf8;
+binmode STDOUT, ":utf8";
+
+my $api_key = $ARGV[0] || "your_api_key";
+
+my $flickr = WebService::Simple->new(
+    base_url => "http://api.flickr.com/services/rest/",
+    param    => { api_key => $api_key, }
+);
+
+my $response =
+  $flickr->get( { method => "flickr.photos.search", text => "cat" } );
+print Dumper $response->parse_response;
Index: lang/perl/WebService-Simple/tags/release-0.05/README
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/README (revision 10295)
+++ lang/perl/WebService-Simple/tags/release-0.05/README (revision 10295)
@@ -0,0 +1,24 @@
+WebService-Simple version 0.04
+
+DESCRIPTION
+
+WebService::Simple is a simple class to interact with web services.
+
+It's basically an LWP::UserAgent that remembers recurring api URLs and
+parameters, plus sugar to parse the results.
+
+INSTALLATION
+
+To install this module, run the following commands:
+
+	perl Makefile.PL
+	make
+	make test
+	make install
+
+LICENSE AND COPYRIGHT
+
+This module is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+See perlartistic.
+
Index: lang/perl/WebService-Simple/tags/release-0.05/.shipit
===================================================================
--- lang/perl/WebService-Simple/tags/release-0.05/.shipit (revision 10295)
+++ lang/perl/WebService-Simple/tags/release-0.05/.shipit (revision 10295)
@@ -0,0 +1,5 @@
+# auto-generated shipit config file.
+steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist,  UploadCPAN
+
+svn.tagpattern = release-%v
+
