File Coverage

blib/lib/Protocol/XMLRPC/MethodResponse.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             package Protocol::XMLRPC::MethodResponse;
2              
3 3     3   51035 use strict;
  3         7  
  3         110  
4 3     3   14 use warnings;
  3         6  
  3         96  
5              
6 3     3   15 use base 'Protocol::XMLRPC::Method';
  3         6  
  3         1817  
7              
8             use Protocol::XMLRPC::ValueFactory;
9              
10             sub new {
11             my $class = shift;
12              
13             my $param;
14              
15             if (@_ == 1) {
16             $param = shift;
17             }
18              
19             my $self = $class->SUPER::new(@_);
20              
21             $self->param($param) if defined $param;
22              
23             return $self;
24             }
25              
26             sub new_fault {
27             my $class = shift;
28              
29             my $self = $class->new();
30              
31             $self->fault(@_);
32              
33             return $self;
34             }
35              
36             sub fault {
37             my $self = shift;
38              
39             if (@_) {
40             my ($code, $string) = @_;
41              
42             $self->{_fault} = Protocol::XMLRPC::Value::Struct->new(
43             faultCode => $code,
44             faultString => $string
45             );
46              
47             return $self;
48             }
49              
50             return $self->{_fault};
51             }
52              
53             sub fault_string {
54             my $self = shift;
55              
56             return unless $self->{_fault};
57              
58             return $self->{_fault}->members->{faultString}->value;
59             }
60              
61             sub fault_code {
62             my $self = shift;
63              
64             return unless $self->{_fault};
65              
66             return $self->{_fault}->members->{faultCode}->value;
67             }
68              
69             sub param {
70             my $self = shift;
71              
72             if (@_) {
73             $self->{_param} = Protocol::XMLRPC::ValueFactory->build(@_);
74             }
75             else {
76             return $self->{_param};
77             }
78             }
79              
80             sub value { shift->param->value }
81              
82             sub _parse_document {
83             my $class = shift;
84             my ($doc) = @_;
85              
86             my ($method_response) = $doc->getElementsByTagName('methodResponse');
87             die "Node is missing" unless $method_response;
88              
89             if (my ($params) = $method_response->getElementsByTagName('params')) {
90             my ($param) = $params->getElementsByTagName('param');
91             die "Node is missing" unless $param;
92              
93             my ($value) = $param->getElementsByTagName('value');
94             die "Node is missing" unless $value;
95              
96             $param = $class->_parse_value($value);
97             die "Can't parse value" unless defined $param;
98              
99             return $class->new(_param => $param);
100             }
101             elsif (my ($fault) = $method_response->getElementsByTagName('fault')) {
102             my ($value) = $fault->getElementsByTagName('value');
103             die "Node is missing" unless defined $value;
104              
105             my $struct = $class->_parse_value($value);
106             die "Value must be 'Struct'" unless $struct && $struct->type eq 'struct';
107              
108             return $class->new(_fault => $struct);
109             }
110              
111             die "Node or is missing";
112             }
113              
114             sub to_string {
115             my $self = shift;
116              
117             my $string = qq||;
118              
119             if (defined $self->fault) {
120             $string .= '';
121              
122             my $struct = $self->fault;
123              
124             $string .= "$struct";
125              
126             $string .= '';
127             }
128             elsif (defined(my $param = $self->param)) {
129             $string .= '';
130              
131             $string .= "$param";
132              
133             $string .= '';
134             }
135             else {
136             die ' or is required';
137             }
138              
139             $string .= '';
140              
141             return $string;
142             }
143              
144             1;
145             __END__