File Coverage

blib/lib/Protocol/XMLRPC/Method.pm
Criterion Covered Total %
statement 31 33 93.9
branch n/a
condition n/a
subroutine 11 11 100.0
pod n/a
total 42 44 95.4


line stmt bran cond sub pod time code
1             package Protocol::XMLRPC::Method;
2              
3 5     5   33 use strict;
  5         8  
  5         155  
4 5     5   25 use warnings;
  5         8  
  5         191  
5              
6 5     5   3096 use Protocol::XMLRPC::Value::Double;
  5         15  
  5         146  
7 5     5   3366 use Protocol::XMLRPC::Value::String;
  5         16  
  5         135  
8 5     5   3038 use Protocol::XMLRPC::Value::Integer;
  5         16  
  5         170  
9 5     5   3323 use Protocol::XMLRPC::Value::Array;
  5         20  
  5         119  
10 5     5   31 use Protocol::XMLRPC::Value::Boolean;
  5         47  
  5         163  
11 5     5   26 use Protocol::XMLRPC::Value::DateTime;
  5         11  
  5         105  
12 5     5   30 use Protocol::XMLRPC::Value::Struct;
  5         12  
  5         99  
13 5     5   3247 use Protocol::XMLRPC::Value::Base64;
  5         12  
  5         167  
14              
15 5     5   8223 use XML::LibXML;
  0            
  0            
16              
17             use overload '""' => sub { shift->to_string }, fallback => 1;
18              
19             sub new {
20             my $class = shift;
21              
22             my $self = {@_};
23             bless $self, $class;
24              
25             return $self;
26             }
27              
28             sub parse {
29             my $class = shift;
30             my ($xml) = @_;
31              
32             my $parser = XML::LibXML->new;
33             my $doc;
34             eval {
35             $doc = $parser->parse_string($xml);
36             1;
37             } or do {
38             die "Can't parse XML: $@";
39             };
40              
41             return $class->_parse_document($doc);
42             }
43              
44             sub _parse_document {
45             }
46              
47             sub _parse_value {
48             my $self = shift;
49             my ($value) = @_;
50              
51             my @types = $value->childNodes;
52              
53             if (@types == 1 && !$types[0]->isa('XML::LibXML::Element')) {
54             return Protocol::XMLRPC::Value::String->new($types[0]->textContent);
55             }
56             elsif (@types == 0) {
57             return Protocol::XMLRPC::Value::String->new('');
58             }
59              
60             my ($type) = grep { $_->isa('XML::LibXML::Element') } @types;
61              
62             if ($type->getName eq 'string') {
63             return Protocol::XMLRPC::Value::String->new($type->textContent);
64             }
65             elsif ($type->getName eq 'i4' || $type->getName eq 'int') {
66             return Protocol::XMLRPC::Value::Integer->parse($type->textContent,
67             alias => $type->getName);
68             }
69             elsif ($type->getName eq 'double') {
70             return Protocol::XMLRPC::Value::Double->parse($type->textContent);
71             }
72             elsif ($type->getName eq 'boolean') {
73             return Protocol::XMLRPC::Value::Boolean->parse($type->textContent);
74             }
75             elsif ($type->getName eq 'dateTime.iso8601') {
76             return Protocol::XMLRPC::Value::DateTime->parse($type->textContent);
77             }
78             elsif ($type->getName eq 'base64') {
79             return Protocol::XMLRPC::Value::Base64->parse($type->textContent);
80             }
81             elsif ($type->getName eq 'struct') {
82             my $struct = Protocol::XMLRPC::Value::Struct->new;
83              
84             my @members = $type->findnodes('member')->get_nodelist;
85             foreach my $member (@members) {
86             my ($name) = $member->getElementsByTagName('name');
87             my ($value) = $member->getElementsByTagName('value');
88              
89             if (defined(my $param = $self->_parse_value($value))) {
90             $struct->add_member($name->textContent => $param);
91             }
92             else {
93             last;
94             }
95             }
96              
97             return $struct;
98             }
99             elsif ($type->getName eq 'array') {
100             my $array = Protocol::XMLRPC::Value::Array->new;
101              
102             my ($data) = $type->getElementsByTagName('data');
103              
104             my (@values) = grep {$_->isa('XML::LibXML::Element')} $data->childNodes;
105             foreach my $value (@values) {
106             if (defined(my $param = $self->_parse_value($value))) {
107             $array->add_data($param);
108             }
109             else {
110             last;
111             }
112             }
113              
114             return $array;
115             }
116              
117             die "Unknown type '" . $type->getName . "'";
118             }
119              
120             1;
121             __END__