Ark

 view release on metacpan or  search on metacpan

lib/Ark/Form.pm  view on Meta::CPAN

                    );
                }
            }
            $target->set_param_data(@_);
        },
        widgets => sub {
            Mouse::load_class($_[0]);
            $target->_widgets_class($_[0]);
        },
    );

    {
        no strict 'refs';
        *{"$target\::x"} = \&x;
    }
}

sub BUILDARGS {
    my ($self, $request, $context) = @_;

    return {
        request => $request,
        $context ? (context => $context) : (),
    };
}

sub BUILD {
    my $self = shift;
    $self->reset;
}

sub reset {
    my $self = shift;

    my $fields = $self->fields;

    $self->_shakan( HTML::Shakan->new(
        request => $self->request,
        fields  => [map { $fields->{$_} } @{ $self->_fields_data_order }],
        $self->can('custom_validation')
            ? (custom_validation => sub { $self->custom_validation(@_) }) : (),
        $self->_widgets_class
            ? (widgets => $self->_widgets_class) : (),
    ));
}

sub field {
    my ($class, $name, $value) = @_;

    if ($value) {
        $class->fields->{ $name } = $value;
    }

    $class->fields->{ $name };
}

sub set_param_data {
    my ($self, $name, %params) = @_;

    my $overwrite = $name =~ s/^\+//;
    my $class     = caller(1);

    $params{name} = $name;

    $class->_fields_messages({}) unless $class->_fields_messages;
    if (my $messages = delete $params{messages}) {
        for my $func (keys %{ $messages || {} }) {
            my $message = $messages->{$func};
            $class->_fields_messages->{ "$name.$func" } = $message;
        }
    }

    $class->_fields_data({}) unless $class->_fields_data;
    if ($overwrite) {
        my $data = $class->_fields_data->{ $name }
            or die qq{param "$name" does not defined by parent class};

        while (my ($k, $v) = each %params) {
            $data->{ $k } = $v;
        }
    }
    else {
        $params{attr} ||= {};
        defined $params{$_} and $params{attr}{$_} ||= $params{$_} for qw/id name value/;

        $class->_fields_data->{ $name } = \%params;
    }

    $class->_fields_data_order([]) unless $class->_fields_data_order;
    push @{ $class->_fields_data_order }, $name
        unless grep { $_ eq $name } @{ $class->_fields_data_order };
}

sub label {
    my ($self, $name) = @_;

    my $field = $self->field($name) or return;
    my $label = $field->label or return;

    unless ($field->id) {
        $field->id(sprintf($self->id_tmpl, $name));
    }

    sprintf q{<label for="%s">%s</label>},
        HTML::Escape::escape_html($field->id), HTML::Escape::escape_html($label);
}

sub input {
    my ($self, $name) = @_;

    my $field = $self->field($name) or return;
    $self->widgets->render( $self, $field );
}

sub render {
    my ($self, $name) = @_;
    return $self->_shakan->render unless $name;

    my $res = ($self->label($name) || '')
            . ($self->input($name) || '')
            . ($self->error_message($name) || '');



( run in 1.749 second using v1.01-cache-2.11-cpan-ceb78f64989 )