/usr/local/CPAN/WebService-SimpleAPI-Wikipedia/WebService/SimpleAPI/Wikipedia/Parser.pm


package WebService::SimpleAPI::Wikipedia::Parser;

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

my @Fileds = qw( language id url title body length redirect strict datetime );
__PACKAGE__->mk_accessors(@Fileds);

use DateTime::Format::W3CDTF;
use XML::Simple;
use WebService::SimpleAPI::Wikipedia::ResultSet;

sub parse {
    my($class, $xml) = @_;

    my $p = XML::Simple->new;
    my $data = $p->XMLin($xml, KeyAttr => []);
    $class->init($data);
}

sub init {
    my($class, $data) = @_;

    my @results;
    if ($data->{result}) {
        @results = ref $data->{result} eq 'ARRAY' ?
            map { bless $_, $class } @{ $data->{result} } : ( bless $data->{result}, $class );
    }
    for my $res (@results) {
        $res->url(URI->new($res->url));
        my $df = DateTime::Format::W3CDTF->new;

        # simpleAPI datetime format bug.
        my $dt = $res->datetime;
        $dt =~ s/(T.+)T(.+)$/$1+$2/;

        $res->datetime( $df->parse_datetime( $dt ) );
    }

    return WebService::SimpleAPI::Wikipedia::ResultSet->new({
        results => \@results,
        nums    => scalar @results,
    });
}

1;