From 9d875e5e5288c6e1c036b2e5527b1537c1c28fa8 Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Mon, 9 Feb 2009 12:50:16 -0500 Subject: [PATCH] Fix has_field inheritance --- lib/HTML/FormHandler.pm | 21 ++++++++++++++++++--- lib/HTML/FormHandler/Meta/Class.pm | 3 ++- lib/HTML/FormHandler/Moose.pm | 15 +-------------- t/has_field.t | 10 +++++++++- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/lib/HTML/FormHandler.pm b/lib/HTML/FormHandler.pm index be33396a..19356bd1 100644 --- a/lib/HTML/FormHandler.pm +++ b/lib/HTML/FormHandler.pm @@ -604,6 +604,7 @@ sub BUILD warn "HFH: build_form for ", $self->name, ", ", ref($self), "\n" if $self->verbose; + $self->build_form; # create the form fields return if defined $self->item_id && !$self->item; $self->init_from_object; # load values from object, if item exists; @@ -1147,10 +1148,10 @@ This is called by the BUILD method. Users don't need to call this. sub build_form { my $self = shift; - - my $meta_flist = $self->meta->field_list if $self->meta->can('field_list'); - my $flist = $self->field_list; + + my $meta_flist = $self->_build_meta_field_list; $self->_build_fields( $meta_flist, 0 ) if $meta_flist; + my $flist = $self->field_list; $self->_build_fields( $flist->{'required'}, 1 ) if $flist->{'required'}; $self->_build_fields( $flist->{'optional'}, 0 ) if $flist->{'optional'}; $self->_build_fields( $flist->{'fields'}, 0 ) if $flist->{'fields'}; @@ -1173,6 +1174,20 @@ sub build_form } +sub _build_meta_field_list +{ + my $self = shift; + my @field_list; + foreach my $sc ( reverse $self->meta->linearized_isa ) + { + if ( $sc->meta->can('field_list') && defined $sc->meta->field_list ) + { + push @field_list, @{$sc->meta->field_list}; + } + } + return \@field_list if scalar @field_list; +} + sub _build_fields { my ( $self, $fields, $required, $auto ) = @_; diff --git a/lib/HTML/FormHandler/Meta/Class.pm b/lib/HTML/FormHandler/Meta/Class.pm index d37e4bb0..60ce37d0 100644 --- a/lib/HTML/FormHandler/Meta/Class.pm +++ b/lib/HTML/FormHandler/Meta/Class.pm @@ -13,7 +13,8 @@ Add metaclass to field_list attribute =cut -has 'field_list' => ( is => 'rw', isa => 'ArrayRef', predicate => 'has_field_list' ); +has 'field_list' => ( is => 'rw', isa => 'ArrayRef', + predicate => 'has_field_list' ); =head1 AUTHOR diff --git a/lib/HTML/FormHandler/Moose.pm b/lib/HTML/FormHandler/Moose.pm index fb172251..822204bc 100644 --- a/lib/HTML/FormHandler/Moose.pm +++ b/lib/HTML/FormHandler/Moose.pm @@ -1,6 +1,5 @@ package HTML::FormHandler::Moose; -use Moose; use Moose::Exporter; use HTML::FormHandler::Meta::Class; @@ -31,7 +30,7 @@ Moose::Exporter->setup_import_methods( ); sub init_meta { - shift; + my $self = shift; Moose->init_meta( @_, metaclass => 'HTML::FormHandler::Meta::Class' ); } @@ -40,18 +39,6 @@ sub has_field my ( $class, $name, %options ) = @_; my $value = $class->meta->field_list || []; - if( scalar @{$value} == 0 ) - { - # first time in this class. - foreach my $sc ( $class->meta->superclasses ) - { - last if $sc eq 'HTML::FormHandler'; - if ( $sc->meta->can('field_list') ) - { - push @{$value}, @{$sc->meta->field_list}; - } - } - } push @{$value}, ($name => \%options); $class->meta->field_list($value); } diff --git a/t/has_field.t b/t/has_field.t index 0e23a55b..5a5d179c 100644 --- a/t/has_field.t +++ b/t/has_field.t @@ -1,4 +1,4 @@ -use Test::More tests => 10; +use Test::More tests => 13; use lib 't/lib'; @@ -23,3 +23,11 @@ $form = Form::Test->new; ok( $form, 'get base form' ); ok( !$form->field_exists('new_field'), 'no new field'); ok( $form->field_exists('optname'), 'base field exists'); + +use_ok( 'Form::Multiple' ); + +my $form = Form::Multiple->new; + +ok( $form, 'create multiple inheritance form' ); + +ok( $form->field('city'), 'field from superclass exists' );