The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Catalyst::Controller::MetaForm::Action::Form;

use Moose;

extends qw/Catalyst::Action/;

has assert => (
  is      => 'ro',
  isa     => 'Bool',
  default => 0,
);

has form_class => (
  is       => 'ro',
  isa      => 'Str',
  required => 1,
);

around BUILDARGS => sub {
  my ($next,$self,@args) = @_;

  my $args = $self->$next (@args);

  return { %$args,%{ $args->{ attributes }->{ metaform }->[0] } };
};

around execute => sub {
  my ($next,$self,$controller,$c,@args) = @_;

  my $form = eval { $self->form_class->new ($c->req->params) };

  if (my $e = $@) {
    if (blessed $e && $e->isa ('Class::MetaForm::Exception')) {
      $c->stash->{ form_error } = $e->simple_message;

      $c->log->debug ("$e") if $c->debug;

      $c->detach ($controller->action_for ('form_error')) if $self->assert;
    } else {
      die $e;
    }
  } else {
    $c->stash->{ form } = $form;
  }

  return $self->$next ($controller,$c,@args);
};

1;