Skip to content

Commit

Permalink
Fix has_field inheritance
Browse files Browse the repository at this point in the history
  • Loading branch information
gshank committed Feb 9, 2009
1 parent dee1ba4 commit 9d875e5
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 19 deletions.
21 changes: 18 additions & 3 deletions lib/HTML/FormHandler.pm
Expand Up @@ -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;
Expand Down Expand Up @@ -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'};
Expand All @@ -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 ) = @_;
Expand Down
3 changes: 2 additions & 1 deletion lib/HTML/FormHandler/Meta/Class.pm
Expand Up @@ -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
Expand Down
15 changes: 1 addition & 14 deletions lib/HTML/FormHandler/Moose.pm
@@ -1,6 +1,5 @@
package HTML::FormHandler::Moose;

use Moose;
use Moose::Exporter;
use HTML::FormHandler::Meta::Class;

Expand Down Expand Up @@ -31,7 +30,7 @@ Moose::Exporter->setup_import_methods(
);

sub init_meta {
shift;
my $self = shift;
Moose->init_meta( @_, metaclass => 'HTML::FormHandler::Meta::Class' );
}

Expand All @@ -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);
}
Expand Down
10 changes: 9 additions & 1 deletion t/has_field.t
@@ -1,4 +1,4 @@
use Test::More tests => 10;
use Test::More tests => 13;

use lib 't/lib';

Expand All @@ -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' );

0 comments on commit 9d875e5

Please sign in to comment.