The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

CatalystX::Resource - Provide CRUD functionality to your Controllers

VERSION

version 0.03

SYNOPSIS

    use Catalyst qw/
        +CatalystX::Resource
    /;

    __PACKAGE__->config(
        'Controller::Resource::Artist' => {
            resultset_key => 'artists',
            resource_key => 'artist',
            form_class => 'TestApp::Form::Resource::Artist',
            model => 'DB::Resource::Artist',
            error_path => '/error',
            actions => {
                base => {
                    PathPart => 'artists',
                },
            },
        },
        'CatalystX::Resource' => {
            controllers => [ qw/ Artist / ],
         },
     );

DESCRIPTION

CatalystX::Resource enhances your App with CRUD functionality.

After creating files for HTML::FormHandler, DBIx::Class and Template Toolkit templates you get create/edit/delete/show/list actions for free.

Resources can be nested. (e.g.: Artist has_many Albums)

traits

default

List ... GET /<resource>/list
Show ... GET /<resource>/*/show
Delete ... POST /<resource>/*/delete
Form
Create ... GET|POST /<resource>/create
Edit ... GET|POST /<resource>/*/edit

optional

MergeUploadParams
Sortable
        POST /<resource>/*/move_next
        POST /<resource>/*/move_previous
        POST /<resource>/*/move_to

You can remove actions if you don't need them.

Example, you don't need the edit action: 'Controller::Resource::Artist' => { ..., traits => ['-Edit'], },

Use the Sortable trait to make your resources sortable: 'Controller::Resource::Artist' => { ..., traits => ['Sortable'], },

CONFIG

controllers

array ref of controller names which will be injected into your app

error_path

CatalystX::Resource detaches to $self->error_path if a resource cannot be found. Make sure you implement this action in your App. (default: '/default')

CAVEAT

Using Moose Method Modifiers on your Resource Controller

If you want to apply Method Modifiers to a resource controller you have to subclass from CatalystX::Resource::Controller::Resource and apply the roles in a BEGIN block.

The following example loads the List trait via with in order to apply a before method modifier.

    package MyApp::Controller::Foo;
    use Moose;
    use namespace::autoclean;

    __PACKAGE__->config(
        resultset_key => 'artists',
        resource_key  => 'artist',
        form_class    => 'TestApp::Form::Resource::Artist',
        model         => 'DB::Resource::Artist',
        traits        => [qw/ MergeUploadParams -Delete /],
        error_path    => '/error',
        actions       => {
            base => {
                PathPart => 'artists',
            },
        },
    );

    BEGIN {
        extends 'CatalystX::Resource::Controller::Resource';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::List';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::Show';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::Form';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::Create';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::Edit';
        with 'CatalystX::Resource::TraitFor::Controller::Resource::Sortable';
    }

    before 'list' => sub { ... }

    1;

Because of a bug in MooseX::MethodAttributes CatalystX::Resource::TraitFor::Controller::Resource::MergeUploadParams is not applied correctly if you include it via with in the BEGIN block of the subclassed controller.

Including it via traits => ['MergeUploadParams'] works around this.

MergeUploadParams is different from the other roles. The other roles add a subroutine whereas MergeUploadParams uses a Moose Method Modifier.

SEE ALSO

Check out Catalyst::Controller::DBIC::API if you want to provide your data as a web service.

AUTHOR

David Schmidt <davewood@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by David Schmidt.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.