package HTML::Widget::Element::Block; use warnings; use strict; use base 'HTML::Widget::Element::NullContainer'; use NEXT; use Carp qw/croak/; __PACKAGE__->mk_classaccessor( block_container_class => 'HTML::Widget::BlockContainer' ); __PACKAGE__->mk_accessors(qw/type wrap_sub/); =head1 NAME HTML::Widget::Element::Block - Block Level Element =head1 SYNOPSIS my $e = $widget->element( 'Block', 'div' ); $e->value('bar'); =head1 DESCRIPTION Block Level Element. Base class for HTML::Widget::Element::Fieldset =head1 METHODS =head2 new Returns a new Block element. Not usually required, use $widget->element() or $block->element() to create a new Block element within an existing widget or element. =cut sub new { return shift->NEXT::new(@_)->type('div'); } =head2 type Default value is div, to create a
container. Can be changed to create a tag of any type. =head2 element Add a new element, nested within this Block. See L for full documentation. =head2 push_content Add previously-created elements to the end of this block's elements. =head2 unshift_content Add previously-created elements to the start of this block's elements. =head2 block_container Creates a new block container object of type $self->block_container_class. Defaults to L. =cut sub block_container { my ( $self, $attributes ) = @_; my $class = $self->block_container_class || 'HTML::Widget::BlockContainer'; my $file = $class . ".pm"; $file =~ s{::}{/}g; eval { require $file }; croak "Unable to load block container class $class: $@" if $@; return $class->new( { passive => $self->passive, %$attributes } ); } =head2 block_container_class Sets the class to be used by $self->block_container. Can be called as a class or instance method. =cut sub block_container_class { my ($self) = shift; if ( not $_[0] and @_ >= 1 ) { delete $self->{block_container_class}; } return $self->_block_container_class_accessor(@_); } =head2 containerize Containerize the block and all its contained elements for later rendering. Uses HTML::Widget::BlockContainer by default, but this can be over-ridden on a class or instance basis via L. =cut sub containerize { my ( $self, $w, $value, $error, $args ) = @_; # NB: block-level HTML::Element generated here my %attrs; unless ( $self->{_anonymous} ) { $attrs{id} = $self->id($w); } my $e = HTML::Element->new( $self->type, %attrs ); my @pre_content = $self->_pre_content_elements($w); my @post_content = $self->_post_content_elements($w); local $w->{attributes}->{id} = $self->id($w); my @content = $w->_containerize_elements( $self->content, $args ); $e->attr( $_ => ${ $self->attributes }{$_} ) for ( keys %{ $self->attributes } ); return $self->block_container( { element => $e, content => \@content, pre_content => \@pre_content, post_content => \@post_content, wrap_sub => $self->wrap_sub, name => $self->name, } ); } sub _pre_content_elements { return (); } sub _post_content_elements { return (); } =head2 get_elements my @elements = $self->get_elements; my @elements = $self->get_elements( type => 'Textfield' ); my @elements = $self->get_elements( name => 'username' ); Returns a list of all elements added to the widget. If a 'type' argument is given, only returns the elements of that type. If a 'name' argument is given, only returns the elements with that name. =head2 get_element my $element = $self->get_element; my $element = $self->get_element( type => 'Textfield' ); my $element = $self->get_element( name => 'username' ); Similar to get_elements(), but only returns the first element in the list. Accepts the same arguments as get_elements(). =head2 find_elements Similar to get_elements(), and has the same alternate forms, but performs a recursive search through itself and child elements. =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 1;