=head1 NAME

MojoX::JSON::RPC - a Perl implementation of the JSON-RPC 2.0 protocol for Mojolicious

=head1 SYNOPSIS

Server as a plugin (L<Mojolicious::Plugin::JsonRpcDispatcher>):

        #!/usr/bin/env perl
        use Mojolicious::Lite;
        use MojoX::JSON::RPC::Service;

        plugin 'json_rpc_dispatcher' => {
            services => {
                '/jsonrpc' => MojoX::JSON::RPC::Service->new->register(
                    'sum',
                    sub {
                        my @params = @_;
                        my $sum    = 0;
                        $sum += $_ for @params;
                        return $sum;
                    }
                )
            }
        };

        app->start;

Client (L<MojoX::JSON::RPC::Client>):

        #!/usr/bin/env perl
        use MojoX::JSON::RPC::Client;

        my $client = MojoX::JSON::RPC::Client->new;
        my $url    = 'http://www.example.com/jsonrpc';
        my $callobj = {
            id      => 1,
            method  => 'sum',
            params  => [ 17, 25 ]
        };

        my $res = $client->call($url, $callobj);

        if($res) {
            if ($res->is_error) { # RPC ERROR
                print 'Error : ', $res->error_message;
            }
            else {
                print $res->result;
            }
        }
        else {
            my $tx_res = $client->tx->res; # Mojo::Message::Response object
            print 'HTTP response '.$tx_res->code.' '.$tx_res->message;
        }

Non-blocking client:

        #!/usr/bin/env perl
        use MojoX::JSON::RPC::Client;

        my $client = MojoX::JSON::RPC::Client->new;
        my $url    = 'http://www.example.com/jsonrpc';
        my $callobj = {
            id      => 1,
            method  => 'sum',
            params  => [ 17, 25 ]
        };

        $client->call($url, $callobj, sub {
            # With callback
            my $res = pop;

            if($res) {
                if ($res->is_error) { # RPC ERROR
                    print 'Error : ', $res->error_message;
                }
                else {
                    print $res->result;
                }
            }
            else {
               my $tx_res = $client->tx->res; # Mojo::Message::Response object
               print 'HTTP response '.$tx_res->code.' '.$tx_res->message;
            }

            Mojo::IOLoop->stop;
        });

        Mojo::IOLoop->start;

=head1 DESCRIPTION

This module implments a client plugin and a server plugin for JSON-RPC
2.0 for use with Mojolicious.

This module follows the draft specficiation for JSON-RPC 2.0. More
information can be found at
L<http://groups.google.com/group/json-rpc/web/json-rpc-2-0>.

=head1 SEE ALSO
 
L<Mojolicious::Plugin::JsonRpcDispatcher>, L<MojoX::JSON::RPC::Dispatcher>,
L<MojoX::JSON::RPC::Client>

=head1 AUTHOR

Henry Tang

=head1 CREDITS

=over 2

Igor Afanasyev

Renee Baecker (https://github.com/reneeb)

Vidar Tyldum <vidar@tyldum.com>

=back

=head1 COPYRIGHT & LICENSE

Copyright (C) 2011-2016, Henry Tang.

MojoX::JSON::RPC is provided "as is" and without any express or
implied warranties, including, without limitation, the implied
warranties of merchantibility and fitness for a particular purpose.

This program is free software, you can redistribute it and/or modify
it under the terms of the Artistic License version 2.0.

=head1 SUPPORT

Dmitry Karasik <dmitry@karasik.eu.org>