Catalyst::Model::XMLRPC - XMLRPC model class for Catalyst


Catalyst-Model-XMLRPC documentation Contained in the Catalyst-Model-XMLRPC distribution.

Index


Code Index:

NAME

Top

Catalyst::Model::XMLRPC - XMLRPC model class for Catalyst

SYNOPSIS

Top

 # Model
 __PACKAGE__->config(
    location => 'http://webservice.example.com:9000',
 );

 # Controller
 sub default : Private {
    my ($self, $c) = @_;

    my $res;

    eval {
        $res = $c->model('RemoteService')->send_request('system.listMethods');
        $c->stash->{value} = $res->value;
    };
    if ($@) {
        # Something went wrong...
    }

    ...
};




DESCRIPTION

Top

This model class uses RPC::XML::Client to invoke remote procedure calls using XML-RPC.

CONFIGURATION

Top

You can pass the same configuration fields as when you call RPC::XML::Client, the only special thing is that the URI is provided via the location field.

METHODS

Top

General

Take a look at RPC::XML::Client to see the method you can call.

new

Called from Catalyst.

NOTES

Top

By default, there is an error_handler and a fault_handler provided for the RPC::XML::Client object that call Carp::croak. You can override it if you want via the config call.

DIAGNOSTICS

Top

Must provide an location

You'll get this error, if you haven't provided a location. See Config.

Can't create RPC::XML::Client object

Something went wrong while trying to create an RPC::XML::Client object. See documentation of this module for further references.

SEE ALSO

Top

* RPC::XML::Client
* RPC::XML
* Catalyst::Model

ACKNOWLEDGEMENTS

Top

* Daniel Westermann-Clark's module, Catalyst::Model::LDAP, it was my reference.
* Lee Aylward, for reporting the issue regarding v.0.03.

AUTHOR

Top

Florian Merges, <fmerges@cpan.org>

LICENSE

Top

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


Catalyst-Model-XMLRPC documentation Contained in the Catalyst-Model-XMLRPC distribution.

package Catalyst::Model::XMLRPC;
use base qw/Catalyst::Model/;
use strict;
use warnings;

use Carp;
use NEXT;
use RPC::XML;
use RPC::XML::Client;

our $VERSION = '0.04';
our $AUTOLOAD;


sub new {
    my ($class, $c, $config) = @_;

    my $self = $class->NEXT::new($c, $config);
    $self->config($config);

    return $self;
}


sub _client {
    my $self = shift;
    my %config = %{ $self->config };

    my $location = $config{location};
    croak "Must provide an location" unless $location;
    delete $config{location};

    unless (exists $config{error_handler}) {
        $config{error_handler} = sub { croak $_[0] };
    }
    unless (exists $config{fault_handler}) {
        $config{fault_handler} = sub { croak $_[0] };
    }

    my $client = RPC::XML::Client->new($location, %config);
    croak "Can't create RPC::XML::Client object"
        unless UNIVERSAL::isa($client, 'RPC::XML::Client');

    return $client;
}


sub AUTOLOAD {
    my ($self, @args) = @_;
    
    return if $AUTOLOAD =~ /::DESTROY$/;

    (my $op = $AUTOLOAD) =~ s/^.*:://;

    my $client = $self->_client;
    
    my $msg = $client->$op(@args);

    return $msg;
}


1;

__END__