NAME Dancer::Plugin::Dispatcher - Simple yet Powerful Controller Class dispatcher for Dancer VERSION version 0.113240 SYNOPSIS use Dancer; use Dancer::Plugin::Dispatcher; get '/' => dispatch '#index'; get '/login' => dispatch '#login'; get '/dashboard' => dispatch '#check_session', '#dashboard'; dance; # or alternatively, define routes in your config file use Dancer; use Dancer::Plugin::Dispatcher; dispatch_auto; dance; DESCRIPTION This Dancer plugin provides a simple mechanism for dispatching code in controller classes which allows you to better seperate and compartmentalize your Dancer application. This plugin is a great building block towards giving your Dancer application an MVC architecture. CONFIGURATION Configuration details will be optionally grabbed from your Dancer config file. For example: plugins: Dispatcher: base: MyApp::Controller If no configuration information is given, this plugin will attempt to use the calling (or main) namespace to dispatch code from. If the base option is supplied with the configuration, this plugin will load that class and all sub classes for your convenience. Alternatively, you may can specify your routes and handlers in your Dancer config file. For example: plugins: Dispatcher: base: MyApp::Controller routes: - "get / > #index" - "get /login > #login" - "get /dashboard > #check_session #dashboard" METHODS dispatch This method takes a shortcut and returns a coderef. The shortcut represents a controller and action (package and sub-routine). The coderef returned wraps that package and sub-routine to be executed by Dancer. The following is the shortcut translation map: The '#' character is used to seperate the controller and action, same as RoR and Mojolicious, e.g. (controller#action). dispatch '#index'; -> Dispatches main->index or MyApp::Controller->index where MyApp::Controller is the value of base in your plugin configuration. dispatch 'event#log'; -> Dispatches main::Event->log or MyApp::Controller::Event->log. dispatch 'post-event#log'; -> Dispatches main::Post::Event->log or MyApp::Controller::Post::Event->log. dispatch 'post_event#log'; -> Dispatches main::PostEvent->log or MyApp::Controller::PostEvent->log. 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 you to perform some actions then pass the request to the next matching route forcing you to use mega-splat and reparse routes to find the next match. Chaining actions with this plugin only requires you to supply multiple shartcuts to the dispatch keyword: get '/secured' => dispatch '#chkdomain', '#chksession', '#secured'; sub chkdomain { return undef unless ! param(domain); return 'Chain broken, domain is missing!'; } sub chksession { return undef unless ! session('user'); return redirect '/'; # maybe flash session timed-out message } sub secured { return 'You made it, Joy'; } If it isn't obvious, when chaining, the dispatch keyword takes multiple shortcuts and returns a coderef that will execute them sequentially. The first action to return content or issue a 3xx series redirect will break the chain. AUTHOR Al Newkirk COPYRIGHT AND LICENSE This software is copyright (c) 2010 by awncorp. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.