The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


RPC::ExtDirect::Migration - Migration notes for RPC::ExtDirect


RPC::ExtDirect version 3.0 represents a major effort to refactor module internals, simplify the architecture and make the whole suite more robust. While every precaution has been taken to make the new version as much backwards compatible as possible, still the scale of the internal changes was so big that some things may have been unintentionally broken and not caught by unit tests. If you encounter any regressions, please file a bug report.

Here is the list of things to keep in mind while upgrading to 3.0, in no particular order:


In RPC::ExtDirect 1.x and 2.x, the preferred way to change certain parts of the module behavior was to use package global variables. One example was $RPC::ExtDirect::DEBUG variable that turned on global debugging; there were several other variables as well.

All these are now deprecated and strongly discouraged from being used. RPC::ExtDirect::Config module is now used to hold configuration options, both global and local.

To turn on global debugging, use the following approach:


In case you only need to turn on detailed exceptions but not the actual debugging mode, use verbose_exceptions Config option instead:


For every deprecated package global variable that has a non-default value, a warning will be issued. There is no way to turn these off; change your code not to use package globals instead.

New Serializer

In 3.0, the old RPC::ExtDirect::Serialize and RPC::ExtDirect::Deserialize classes have been deprecated in favor of the new RPC::ExtDirect::Serializer that is intended to be used in an instance based fashion instead of the old class based way.

Both modules are still provided, with their respective class methods changed to stubs that will provide backwards compatibility. A warning will be issued if these methods are called.

This change may cause possible issues if you have relied on specific exception output in your unit tests.

API tree handling

In 1.x and 2.x, the Ext.Direct API tree was held in disjointed hash variables in RPC::ExtDirect module. In 3.0, the API is held in an instance of RPC::ExtDirect::API; it is now possible to initialize the API from a hashref instead of ExtDirect attributes, and have more than one API tree per application server.

This change should not affect your code directly, unless you were doing something funky with RPC::ExtDirect internals.

Actions, Methods, and Hooks are now objects

Besides the API tree itself, the handling of Actions, Methods, and Hooks also changed in 3.0. Instead of hash entries they are now objects, with behavior fully overridable in subclasses. A new Config option now exists for each of these, to supply your class name instead of the default RPC::ExtDirect::API::Action, RPC::ExtDirect::API::Method, and RPC::ExtDirect::API::Hook, respectively.

Conditional API generation

In 1.x and 2.x, there was no way to affect Ext.Direct API generation; it was always created from the defined set of Actions and Methods. In 3.0, the API JavaScript chunk is generated by walking the API tree and asking every Method to return their declaration.

This happens in "get_api_definition" in RPC::ExtDirect::API::Method method, which also receives an environment object when called. It is also possible to exclude any particular Method from being declared in the API by returning undef, which makes per-user personalized API declarations possible.

Action naming

Before Ext JS 4.2.1, it was not possible to declare nested Ext.Direct Action names. This construct would not work properly:

    package Foo::Bar;
    use RPC::ExtDirect Action => 'Foo.Bar';
    sub baz : ExtDirect(0) {}

Rather, the method stub on the client side would have to be called in an ugly fashion:


This issue has been addressed in Ext JS 4.2.1 and later versions, and support for this feature has now been added to RPC::ExtDirect. You can set api_full_action_names global Config option to make Action names default to full package name instead of the old behavior.

Note that Sencha Touch 2.x does not support this feature, as well as Ext JS versions before 4.2.1. This is the reason why Action name generation defaults to using only the last portion of the namespace, as it was in RPC::ExtDirect since 1.x.

Method code invocation

Before 3.0, the actual Method code invocation happened in a private method of a RPC::ExtDirect::Request object, making any changes to Method behavior to be very hard to implement. This has been changed to a more open way of doing things; "run" in RPC::ExtDirect::API::Method is calling the code and can be easily overridden in a subclass to add application specific checks or enhancements.

Besides changing the place where the Method code is called, the way it is called was also changed to be more compatible with class inheritance.

Method argument preparation

Another change has been made to the way Method arguments are processed; the methods that are doing this for ordered, named, and formHandler arguments are public and overridable now.

Another addition is the new lazy parameter check feature for named Methods; it allows passing all arguments to a Method instead of only declared ones.

See "prepare_method_arguments" in RPC::ExtDirect::API::Method for more information.

Hook definition

Starting with 3.0, it is now possible to define a Hook with a 'Package::sub' string instead of a coderef. This makes lazy hook code binding possible.

See "new" in RPC::ExtDirect::API::Hook for more detail.

Hook invocation signature

A hook subroutine used to receive several parameters that described the Method that was about to be invoked, as well as the other Hooks involved for the Method. These disjointed parameters are now deprecated, and the corresponding RPC::ExtDirect::API::Method and RPC::ExtDirect::API::Hook objects are passed instead, which makes it easier to get the information.

The old parameters are still passed to Hook subroutines, but users are advised to change their code to take advantage of the new approach. See "CALLING CONVENTION" in RPC::ExtDirect::API::Hook for more detail.

Environment objects optional for Methods

When Environment objects were introduced in RPC::ExtDirect 2.0, the default behavior was to pass them to both Methods and Hooks. This has caused problems with Moose generated accessors exposed through RPC::ExtDirect; a getter would expect exactly 0 arguments and freak out on receiving an env object. Besides that, passing env objects to every Method has proved to be less useful than thought initially.

Starting with 3.0, a Method will receive an env object only when requested with env_arg option.

Event constructor signature

RPC::ExtDirect::Event used to accept arguments only by position; this has been changed to accepting both ordered and named arguments for the sake of easier integration with Moose and other environments with established calling conventions.

See "new" in RPC::ExtDirect::Event for more detail.