NAME Dancer::Plugin::Dispatcher - Controller Class Dispatching System for Dancer VERSION version 0.13 SYNOPSIS use Dancer; use Dancer::Plugin::Dispatcher; get '/login' => dispatch '#login'; get '/dashboard' => dispatch '#check_session', '#dashboard'; sub login { halt 'Unauthorized' unless login_okay scalar params; redirect '/dashboard'; } sub check_session { var sessions => generate_session; } sub dashboard { template 'dashboard'; } dance; DESCRIPTION Dancer::Plugin::Dispatcher provides a mechanism for dispatching HTTP requests to controller classes allowing you to better separate and compartmentalize your Dancer application. This simple approach is a building block towards giving your Dancer application a more scalable MVC architecture. Note: This is an early release available for testing and feedback and as such is subject to change. The latest release of this distribution breaks backwards compatibility with version 0.12 or anything prior. This plugin leverages dependency injection to load the objects that the HTTP requests will be dispatched to. The invesion of control container is provided by Beam::Wire which supports various patterns for dynamically loading controllers. METHODS dispatch This method takes a string, referred to as a dispatch string, and returns a coderef. The dispatch string represents a controller service and action. The controller service is a Beam::Wire service container configuration. All controller services should be specified under the services property in the plugin configuration. The controller service action is a method on the object which the service loads. The following are the dispatch string semantics: plugins: Dispatcher: services: artists: class: MyApp::Artist The '#' character is used to separate the controller service name and action (method): e.g. (service#action). dispatch '#index'; -> dispatches main->index or caller->index where caller is the namespace of whichever package loads the plugin dispatch 'artists#find'; # dispatches MyApp::Artist->new->find dispatch 'artists#single'; # dispatches MyApp::Artist->new->single Another benefit in using this plugin is a better method of chaining actions. The current method of chaining suggests that you create a catch-all* route which you then use to perform some actions then pass the request to the next matching route forcing you to use mega-splat and re-parse routes to find the next match. Chaining actions with this plugin only requires you to supply multiple dispatch strings to the dispatch keyword: get '/secured' => dispatch '#check_session', '#secured'; sub chksession { return redirect '/' unless session 'user'; } sub secured { template 'secured'; } If it isn't obvious, when chaining, the dispatch keyword takes multiple dispatch strings and returns a coderef that will execute them sequentially. The first action to explicitly halt execution, by calling Dancer's halt keyword, or issue a 3xx series redirect will break the dispatch chain. CONFIGURATION Configuration details will be optionally grabbed from your Dancer config file although no configuration is neccessary. For example: plugins: Dispatcher: services: artists: class: MyApp::Artist albums: class: MyApp::Album songs: class: MyApp::Song If no configuration information is given, this plugin will attempt to use the calling (or main) namespace as the controller where requests will be dispatched. Controller methods can have a prefix and/or a suffix automatically applied before dispatch. For example: plugins: Dispatcher: prefix: do_ suffix: _action services: artists: class: MyApp::Artist albums: class: MyApp::Album songs: class: MyApp::Song The prefix and suffix values are optional and will be applied be resolving the controller dispatch chain. get '/' => dispatch '#index'; # will execute do_index_action AUTHORS * Al Newkirk * Naveed Massjouni CONTRIBUTORS * Al Newkirk * David Zurborg COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Al Newkirk. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.