Skip to content

Commit

Permalink
apply rendering roles with MooseX::Traits
Browse files Browse the repository at this point in the history
  • Loading branch information
Gerda Shank authored and Gerda Shank committed Sep 27, 2009
1 parent c1bbc9d commit da81ba9
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 10 deletions.
34 changes: 32 additions & 2 deletions lib/HTML/FormHandler/BuildFields.pm
Expand Up @@ -259,19 +259,49 @@ sub _update_or_create {
}
else # replace existing field
{
$field = $class->new( %{$field_attr} );
$field = $self->new_field_with_traits( $class, $field_attr);
$parent->set_field_at( $index, $field );
}
}
else # new field
{
$field = $class->new( %{$field_attr} );
$field = $self->new_field_with_traits( $class, $field_attr);
$parent->add_field($field);
}
$field->form->reload_after_update(1)
if ( $field->form && $field->reload_after_update );
}

sub new_field_with_traits {
my ( $self, $class, $field_attr ) = @_;

my $widget = $field_attr->{widget};
my $field;
unless( $widget ) {
my $attr = $class->meta->get_attribute('widget');
$widget = $class->meta->get_attribute('widget')->default if $attr;
}
my $widget_wrapper = $field_attr->{widget_wrapper};
unless( $widget_wrapper ) {
my $attr = $class->meta->get_attribute('widget_wrapper');
$widget_wrapper = $class->meta->get_attribute('widget')->default if $attr;
$widget_wrapper ||= 'Simple';
}
if( $widget ) {
my $widget_role = $self->get_widget_role( $widget, 'Field' );
my $wrapper_role = $self->get_widget_role( $widget_wrapper, 'Wrapper' );
$field = $class->new_with_traits( traits => [$widget_role, $wrapper_role], %{$field_attr} );
}
else {
$field = $class->new( %{$field_attr} );
}
foreach my $key ( keys %{$field->form->widget_tags} ) {
$field->set_tag( $key, $field->form->widget_tags->{$key} )
unless $field->tag_exists($key);
}
return $field;
}

=head1 AUTHORS
HTML::FormHandler Contributors; see HTML::FormHandler
Expand Down
6 changes: 1 addition & 5 deletions lib/HTML/FormHandler/Field.pm
Expand Up @@ -816,7 +816,7 @@ sub BUILD {

$self->_set_default( $self->_comp_default_meth )
if( $self->form && $self->form->can( $self->_comp_default_meth ) );
$self->apply_rendering_widgets;
$self->apply_rendering_widgets unless ($self->can('render') );
$self->add_action( $self->trim ) if $self->trim;
$self->_build_apply_list;
$self->add_action( @{ $params->{apply} } ) if $params->{apply};
Expand Down Expand Up @@ -994,10 +994,6 @@ sub apply_rendering_widgets {

if( $self->form ) {
$self->add_widget_name_space( @{$self->form->widget_name_space} );
foreach my $key ( keys %{$self->form->widget_tags} ) {
$self->set_tag( $key, $self->form->widget_tags->{$key} )
unless $self->tag_exists($key);
}
}
if ( $self->widget ) {
$self->apply_widget_role( $self, $self->widget, 'Field' );
Expand Down
10 changes: 7 additions & 3 deletions lib/HTML/FormHandler/Widget/ApplyRole.pm
Expand Up @@ -9,16 +9,20 @@ our $ERROR;
sub apply_widget_role {
my ( $self, $target, $widget_name, $dir ) = @_;

my $render_role = $self->get_widget_role( $widget_name, $dir );
$render_role->meta->apply($target) if $render_role;
}

sub get_widget_role {
my ( $self, $widget_name, $dir ) = @_;
my $widget_class = $self->widget_class($widget_name);
my $ldir = $dir ? '::' . $dir . '::' : '::';
my @name_spaces = ( @{$self->widget_name_space}, 'HTML::FormHandler::Widget' );
my $found;
foreach my $ns (@name_spaces) {
my $render_role = $ns . $ldir . $widget_class;
if ( try_load_class($render_role) ) {
$render_role->meta->apply($target);
$found++;
last;
return $render_role;
}
}
die "$dir widget $widget_class not found in " . join ", ", @name_spaces unless $found;
Expand Down

0 comments on commit da81ba9

Please sign in to comment.