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

NAME

Class::MetaForm - Gluing forms onto Moose

WARNING

This is a development version, treat it as such

SYNOPSIS

  package My::ContactForm;

  use Moose;
  use Class::MetaForm;

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

  has age => (
    is        => 'ro',
    isa       => 'Int',
    predicate => 'has_age',
  );

  has email => (
    is       => 'ro',
    isa      => 'EmailType',
    required => 1,
  );

  # In a controller far, far away

  my $form = My::ContactForm->new ($c->req->params);

  # By the way, see Catalyst::Controller::MetaForm for more sugaring
  # when using MetaForm with Catalyst.

DESCRIPTION

There are quite a few web form validation modules on CPAN. Some are okay, most usually requires more effort using than what manual form validation would require. For some time now, I've wanted to write a form validator since I have yet to find one that I can really like. As I just stated, most form validators requirse too much effort to use and some want to run the entire show, trying to force your application to be structured in a certain way. So my goals for a new validators were to keep it simple and nonintrusive.

So how does it actually work? Class::MetaForm is in itself just a sugar module for setting up some roles and traits in your class. It really doesn't do a whole lot:

Filtering

Empty strings are removed from the arguments. This is because when a field is present in a form, an empty string is used to indicate that the field has not been filled in by the user, and hence would be equivalent to not providing the parameter in Moose.

It also converts an argument like:

  'foo.bar' => 42

Into:

  foo => { bar => 42 }

Attribute ordering

A trait is added to the class in order to make attribute initialization done in the same order that attributes were added to the class.

Exceptions

Moose errors are difficult to understand; For a computer program at least. Moose itself should be throwing real exception objects. But it doesn't so we install some sugar that tries it best to parse the error messages that Moose spits out.

Hashref coercion

So you can take adventage of the above hash filtering to have multiple form objects as children of the current one.

  package My::AddressForm;

  use Moose;
  use Class::MetaForm;

  has name => (
    is  => 'ro',
    isa => 'Str',
  );

  has zipcode => (
    is  => 'ro',
    isa => 'Str',
  );

  package My::RegisterForm;

  use Moose;
  use Class::MetaForm;

  has billing => (
    is       => 'ro',
    isa      => 'My::AddressForm',
    required => 1,
  );

Accepting the form parameters billing.name and billing.zipcode, accessible as

  $form->billing->name

MooseX::MetaDescription

The trait provided by MooseX::MetaDescription is added to your attribute metaclass so you can provide additional descriptive information in them. Most notably, the exception objects thrown will use it to make the error message more human readable.

  has mysillyattributename => (
    is => 'ro',
    isa => 'Str',
    description => { label => 'mylesssillyname' },
  );

SEE ALSO

HTML::FormFu
HTML::FormHandler
Moose

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.

AUTHOR

Anders Nor Berle <berle@cpan.org>

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.