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

use base qw/Catalyst::Controller/;

use Catalyst::Controller::MetaForm::Action::Form;
use Class::MOP;

use strict;
use warnings;

our $VERSION = '0.01_03';

sub create_action {
  my ($self,%args) = @_;

  if ($args{ attributes }{ metaform }) {
    $args{ attributes }{ ActionClass } = [ 'Catalyst::Controller::MetaForm::Action::Form' ];
  }

  return $self->next::method (%args);
}

sub _parse_Form_attr {
  my ($self,$app,$name,$value) = @_;

  return metaform => { form_class => $self->_expand_form_name ($app,$value) };
}

sub _parse_AssertForm_attr {
  my ($self,$app,$name,$value) = @_;

  return metaform => { assert => 1,form_class => $self->_expand_form_name ($app,$value) };
}

sub _expand_form_name {
  my ($self,$app,$form_name) = @_;

  $form_name = "$app\::Form::$form_name" unless $form_name =~ s/^\+//;

  Class::MOP::load_class ($form_name);

  return $form_name;
}

sub form_error : Private {}

1;

__END__

=pod

=head1 NAME

Catalyst::Controller::MetaForm - MetaForm sugar for Catalyst

=head1 SYNOPSIS

  package MyApp::Form::Login;

  use Moose;

  use Class::MetaForm;

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

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

  package MyApp::Controller::Auth;

  use base qw/Catalyst::Controller::MetaForm/;

  use strict;
  use warnings;

  # This will require the form MyApp::Form::Login to be successfully
  # validated before the code gets to execute.

  sub login : Local AssertForm('Login') Args(0) {
    my ($self,$c) = @_;

    # We will always have $c->stash->{ form } here.
  }

  # In this case, the form MyApp::Form::Something doesn't have to be
  # valid in order for the action to execute.

  sub somethingelse : Local Form('Login') Args(0) {
    my ($self,$c) = @_;

    # $c->stash->{ form } will be undefined if it wasn't successfully
    # validated. The error can be found in $c->stash->{ form_error }
  }

  1;

=head1 DESCRIPTION

See L<Class::MetaForm> for an actual description.

=head1 MORE SUGARING?

Add the following snippet to your MyApp.pm for quick access to your
stashed form.

  sub form { shift->stash->{ form } }

=head1 SEE ALSO

=over 4

=item L<Catalyst>

=item L<Class::MetaForm>

=back

=head1 BUGS

Most software has bugs. This module probably isn't an exception. 
If you find a bug please either email me, or add the bug to cpan-RT.

=head1 AUTHOR

Anders Nor Berle E<lt>berle@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2009 by Modula AS

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

=cut