On Mon, Sep 20, 2010 at 4:33 AM, John Romkey <[email protected]> wrote: > On Sep 19, 2010, at 10:02 PM, Pavel A. Karoukin wrote: >> I started to play more often with Catalyst framework and found that I often >> need to re-use some controllers logic. What the best DRY way to deal, for >> example, with Login/Register/Forgotpassword controllers? >> >> I mean I created one controller for one app. For another app I am doing I >> need to recreate everything, which ends up in plain copy/pasting and >> changing class names. I do not like this, this doesn't feel DRY. Is there >> some better way? Something plugable and unplugable with their own >> models/controller/view may be? > > One approach is to simply inherit from the controller you want to reuse. So, > package up the controllers you want to reuse together, then use Moose to > extend them in the controller modules in each app that uses them. That > allows you quite a bit of flexibility; use a common convention for the start > of the dispatch chain (for instance, 'base') for each controller and then > your subclass can map its parent controller to whatever path is best for each > app. > - john romkey > http://www.romkey.com/ > > > _______________________________________________ > List: [email protected] > Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst > Searchable archive: http://www.mail-archive.com/[email protected]/ > Dev site: http://dev.catalyst.perl.org/ >
Another nice approach to reuse Controller Logic is to use Moose Roles. I got the basics from t0ms blog (http://bobtfish.livejournal.com/#post-bobtfish-264317) An example how i use it can be found here http://wiki.catalystframework.org/wiki/wikicookbook/controllerwithfileupload (the interesting part is in the file Resource.pm in the attachment http://wiki.catalystframework.org/wiki/wikicookbook/ControllerWithFileUpload.attachment/100) ************* package CatalystX::TraitFor::Controller::Resource; use MooseX::MethodAttributes::Role; use namespace::autoclean; sub base : Chained('') PathPart('') CaptureArgs(0) { my ($self, $c ) = @_; ... }; sub index :Chained('base') :PathPart('') :Args(0) { my ($self, $c ) = @_; ... } 1; ************* david _______________________________________________ List: [email protected] Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/[email protected]/ Dev site: http://dev.catalyst.perl.org/
