package HTML::Widget::Element::NullContainer; use warnings; use strict; use base 'HTML::Widget::Element'; use NEXT; use Carp qw/croak/; __PACKAGE__->mk_accessors(qw/content/); *elem = \&element; =head1 NAME HTML::Widget::Element::NullContainer - Null Container Element =head1 SYNOPSIS my $e = $widget->element( 'NullContainer'); $e->element('Textfield', 'bar'); =head1 DESCRIPTION NullContainer Level Element. Base class for HTML::Widget::Element::Block May also be useful for canned subwidgets. See L for documentation of most methods. =head1 METHODS =head2 new Sets L to false, so that filters added by C<< $widget->filter_all >> won't be applied to Span elements. Sets L to false, so that constraints added by C<< $widget->constraint_all >> won't be applied to Span elements. =cut sub new { my $self = shift->NEXT::new(@_); $self->allow_filter(0)->allow_constraint(0)->content( [] ); return $self; } =head2 elem =head2 element Arguments: $type, $name, \%attributes Return Value: $element See L for details. =cut sub element { my ( $self, $type, $name, $attrs ) = @_; my $abs = $type =~ s/^\+//; $type = "HTML::Widget::Element::$type" unless $abs; my $element = HTML::Widget->_instantiate( $type, { name => $name } ); $element->{_anonymous} = 1 if !defined $name; $self->push_content($element); if ( defined $attrs ) { eval { $element->attributes->{$_} = $attrs->{$_} for keys %$attrs; }; croak "attributes argument must be a hash-reference: $@" if $@; } return $element; } =head2 push_content =cut sub push_content { push @{ shift->content }, @_; } =head2 unshift_content =cut sub unshift_content { unshift @{ shift->content }, @_; } =head2 containerize =cut sub containerize { my ( $self, $w, $value, $error, $args ) = @_; local $w->{attributes}->{id} = $self->id($w); my @content = $w->_containerize_elements( $self->content, $args ); return HTML::Widget::NullContainer->new( { passive => $self->passive, element => 1, content => \@content, name => $self->name, } ); } =head2 id =cut sub id { my ( $self, $w ) = @_; return $w->name if $self->{_anonymous}; my $name = $self->name(); if ( $name =~ s/^_implicit_// ) { # $name is left set to the name of the # original parent widget of this element, as set by # H::W::_setup_implicit_subcontainer. } return $w->name . '_' . $name; } =head2 get_elements =cut sub get_elements { my ( $self, %opt ) = @_; return $self->_match_elements( $self->content, \%opt ); } =head2 get_element =cut sub get_element { my ( $self, %opt ) = @_; return ( $self->get_elements(%opt) )[0]; } =head2 find_elements =cut sub find_elements { my ( $self, %opt ) = @_; my @elements = ($self); push @elements, map { $_->find_elements(%opt) } @{ $self->content }; return $self->_match_elements( \@elements, \%opt ); } sub _match_elements { my ( $self, $elements, $opt ) = @_; if ( exists $opt->{type} ) { my $type = "HTML::Widget::Element::$opt->{type}"; return grep { $_->isa($type) } @$elements; } elsif ( exists $opt->{name} ) { my $name = $opt->{name}; return grep { $_->name and $_->name eq $name } @$elements; } return @$elements; } =head2 prepare See L =cut sub prepare { my ( $self, $w ) = @_; map { $_->prepare($w) } @{ $self->content }; } =head2 init See L =cut sub init { my ( $self, $w ) = @_; for my $element ( @{ $self->content } ) { $element->init($w) unless $element->{_initialized}; $element->{_initialized}++; } } =head2 process See L =cut sub process { my ( $self, $params, $uploads ) = @_; my $errors; for my $element ( @{ $self->content } ) { my $er = $element->process( $params, $uploads ); push @$errors, @$er if $er; } return $errors; } =head1 SEE ALSO L =head1 AUTHOR Michael Gray, C =head1 LICENSE This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut package HTML::Widget::NullContainer; use warnings; use strict; use base 'HTML::Widget::Container'; __PACKAGE__->mk_accessors(qw/content/); sub _build_element { my $self = shift; return ( map { $_->as_list } @{ $self->content } ); } 1;