# NAME Dancer2::Plugin::RPC - Namespace for XMLRPC, JSONRPC2 and RESTRPC plugins # DESCRIPTION This module contains plugins for [Dancer2](https://metacpan.org/pod/Dancer2): [Dancer2::Plugin::RPC::XMLRPC](https://metacpan.org/pod/Dancer2%3A%3APlugin%3A%3ARPC%3A%3AXMLRPC), [Dancer2::Plugin::RPC::JSONRPC](https://metacpan.org/pod/Dancer2%3A%3APlugin%3A%3ARPC%3A%3AJSONRPC) and [Dancer2::Plugin::RPC::RESTRPC](https://metacpan.org/pod/Dancer2%3A%3APlugin%3A%3ARPC%3A%3ARESTRPC). ## Dancer2::Plugin::RPC::XMLRPC This plugin exposes the new keyword `xmlrpc` that is followed by 2 arguments: the endpoint and the arguments to configure the xmlrpc-calls at this endpoint. ## Dancer2::Plugin::RPC::JSONRPC This plugin exposes the new keyword `jsonrpc` that is followed by 2 arguments: the endpoint and the arguments to configure the jsonrpc-calls at this endpoint. ## Dancer2::Plugin::RPC::RESTRPC This plugin exposes the new keyword `restrpc` that is followed by 2 arguments: the endpoint and the arguments to configure the restrpc-calls at this endpoint. ## General arguments to xmlrpc/jsonrpc/restrpc The dispatch table is build by endpoint. ### publish => <config|pod|$coderef> - publish => **config** The dispatch table is build from the YAML-config: ```yaml plugins: 'RPC::XMLRPC': '/endpoint1': 'Module::Name1': method1: sub1 method2: sub2 'Module::Name2': method3: sub3 '/endpoint2': 'Module::Name3': method4: sub4 ``` The **arguments** argument should be empty for this publishing type. - publish => **pod** The dispatch table is build by parsing the POD for `=for xmlrpc`, `=for jsonrpc` or `=for restrpc`. ```perl =for xmlrpc [] ``` The **arguments** argument must be an Arrayref with module names. The POD-directive must be in the same file as the code! - publish => **$coderef** With this publishing type, you will need to build your own dispatch table and return it. ```perl use Dancer2::RPCPlugin::DispatchItem; return { method1 => Dancer2::RPCPlugin::DispatchItem->new( package => 'Module::Name1', code => Module::Name1->can('sub1'), ), method2 => Dancer2::RPCPlugin::DispatchItem->new( package => 'Module::Name1', code => Module::Name1->can('sub2'), ), method3 => Dancer2::RPCPlugin::DispatchItem->new( pacakage => 'Module::Name2', code => Module::Name2->can('sub3'), ), }; ``` ### arguments => $list This argumument is needed for publishing type **pod** and must be a list of module names that contain the pod (and code). ### callback => $coderef The **callback** argument may contain a `$coderef` that does additional checks and should return a [Dancer2::RPCPlugin::CallbackResult](https://metacpan.org/pod/Dancer2%3A%3ARPCPlugin%3A%3ACallbackResult) object (with the use of [Dancer2::RPCPlugin::CallbackResultFactory](https://metacpan.org/pod/Dancer2::RPCPlugin::CallbackResultFactory)). $callback->($request, $method_name, @method_args); Returns for success: `callback_success()` Returns for failure: `callback_fail(error_code => $code, error_message => $msg)` This is useful for ACL checking. ### code\_wrapper => $coderef The **code\_wrapper** argument can be used to wrap the code (from the dispatch table). ```perl my $wrapper = sub { my $code = shift; my $pkg = shift; my $method = shift; my $instance = $pkg->new(); $instance->$code(@_); }; ``` # LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See: - [http://www.perl.com/perl/misc/Artistic.html](http://www.perl.com/perl/misc/Artistic.html) - [http://www.gnu.org/copyleft/gpl.html](http://www.gnu.org/copyleft/gpl.html) This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # AUTHOR © MMXVII - Abe Timmerman