Protocol::XMLRPC::MethodCall - XML-RPC methodCall request


Protocol-XMLRPC documentation Contained in the Protocol-XMLRPC distribution.

Index


Code Index:

NAME

Top

Protocol::XMLRPC::MethodCall - XML-RPC methodCall request

SYNOPSIS

Top

    my $method_call = Protocol::XMLRPC::MethodCall->new(name => 'foo.bar');
    $method_call->add_param(1);

    $method_call = Protocol::XMLRPC::MethodCall->parse(...);

DESCRIPTION

Top

XML-RPC methodCall request object.

ATTRIBUTES

Top

params

Holds method call name.

params

Holds array reference of all passed params as objects.

METHODS

Top

new

Creates a new Protocol::XMLRPC::MethodCall instance. Name is required.

parse

    my $method_call = Protocol::XMLRPC::MethodCall->parse('<?xml ...');

Creates a new Protocol::XMLRPC::MethodCall from xml.

add_param

    $method_call->add_param(1);
    $method_call->add_param(Protocol::XMLRPC::Value::String->new('foo'));

Adds param. Tries to guess a type if a Perl5 scalar/arrayref/hashref was passed instead of an object.

to_string

    my $method_call = Protocol::XMLRPC::MethodCall->new(name => 'foo.bar');
    $method_call->add_param('baz');
    # <?xml version="1.0"?>
    # <methodCall>
    #    <methodName>foo.bar</methodName>
    #    <params>
    #       <param>
    #          <value><string>baz</string></value>
    #       </param>
    #    </params>
    # </methodCall>

Protocol::XMLRPC::MethodCall string representation.

AUTHOR

Top

Viacheslav Tykhanovskyi, vti@cpan.org.

COPYRIGHT

Top


Protocol-XMLRPC documentation Contained in the Protocol-XMLRPC distribution.

package Protocol::XMLRPC::MethodCall;

use strict;
use warnings;

use base 'Protocol::XMLRPC::Method';

use Protocol::XMLRPC::ValueFactory;
require Carp;

sub new {
    my $self = shift->SUPER::new(@_);

    $self->{params} ||= [];

    Carp::croak('name is required') unless $self->name;

    return $self;
}

sub name   { defined $_[1] ? $_[0]->{name}   = $_[1] : $_[0]->{name} }
sub params { defined $_[1] ? $_[0]->{params} = $_[1] : $_[0]->{params} }

sub add_param {
    my $self = shift;
    my $param = shift;

    my $value = Protocol::XMLRPC::ValueFactory->build($param);
    return unless $value;

    push @{$self->params}, $value;
}

sub _parse_document {
    my $class = shift;
    my ($doc) = @_;

    my ($method_call) = $doc->getElementsByTagName('methodCall');
    return unless $method_call;

    my ($name) = $method_call->getElementsByTagName('methodName');
    return unless $name;

    my $self = $class->new(name => $name->textContent);

    if (my ($params) = $method_call->getElementsByTagName('params')) {
        my @params = $params->getElementsByTagName('param');
        foreach my $param (@params) {
            my ($value) = $param->getElementsByTagName('value');

            if (my $param = $self->_parse_value($value)) {
                push @{$self->params}, $param;
            }
            else {
                return;
            }
        }
    }

    return $self;
}

sub to_string {
    my $self = shift;

    my $method_name = $self->name;

    my $string = qq|<?xml version="1.0"?><methodCall><methodName>$method_name</methodName>|;

    $string .= '<params>';

    foreach my $params (@{$self->params}) {
        $string .= '<param><value>' . $params->to_string . "</value></param>";
    }

    $string .= '</params>';

    $string .= '</methodCall>';

    return $string;
}

1;
__END__