The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package HTML::Shakan::Declare;
use strict;
use warnings;
use parent 'Exporter';
use HTML::Shakan ();

our @EXPORT = qw(form get);

sub import {
    my $class = shift;
    __PACKAGE__->export_to_level(1);
    HTML::Shakan::Fields->export_to_level(1);
}

our $FORMS;
sub form ($@) { ## no critic.
    my ($name, @fields) = @_;
    my $pkg = caller(0);
    $FORMS->{$pkg}->{$name} = \@fields;
}

sub get {
    my ($class, $name, %args) = @_;
    $class = ref $class || $class;
    return HTML::Shakan->new(
        fields => $FORMS->{$class}->{$name},
        %args,
    );
}

1;
__END__

=head1 NAME

HTML::Shakan::Declare - declare the form

=head1 SYNOPSIS

    # declare
    {
        package My::Form;
        use HTML::Shakan::Declare;

        form 'add' => (
            TextField(
                name     => 'name',
                required => 1,
            ),
            TextField(
                name     => 'email',
                required => 1,
            ),
        );
    }

    # use it
    {
        my $form = My::Form->get(
            'add' => (
                request => CGI->new,
            )
        );
        $form->render;
    }

=head1 DESCRIPTION

This module supports to generate form using declare style.

=head1 FUNCTIONS

This module exports L<HTML::Shakan::Fields>'s exported functions and following functions.

=over 4

=item form($name, \@fields)

Register new form named I<$name> with C<<\@fields>>.

=back

=head1 EXPORTED METHODS

=over 4

=item Your::Form::Class->get($name[, %args])

Now, your form class provides I< get > method. This method returns instance of L<HTML::Shakan>.

=back

=head1 AUTHORS

Tokuhiro Matsuno

=head1 SEE ALSO

L<HTML::Shakan>