The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package HTML::Widget::Container;

use warnings;
use strict;
use base 'Class::Accessor::Fast';

__PACKAGE__->mk_accessors(qw/element error javascript/);

use overload '""' => sub { return shift->as_xml }, fallback => 1;

*js        = \&javascript;
*js_xml    = \&javascript_xml;
*field     = \&element;
*field_xml = \&element_xml;

=head1 NAME

HTML::Widget::Container - Container

=head1 SYNOPSIS

    my $container  = $form->element('foo');
    
    my $field = $container->field;
    my $error = $container->error;

    my $field_xml      = $container->field_xml;
    my $error_xml      = $container->error_xml;
    my $javascript_xml = $container->javascript_xml;

    my $xml = $container->as_xml;

    my $javascript = $container->javascript;

=head1 DESCRIPTION

Container.

=head1 METHODS

=head2 $self->as_xml

Returns xml.

=cut

sub as_xml {
    my $self = shift;
    my $xml  = '';
    $xml .= $self->javascript_xml if $self->javascript;
    $xml .= $self->element_xml    if $self->element;
    $xml .= $self->error_xml      if $self->error;
    return $xml;
}

=head2 $self->as_list

Returns a list of L<HTML::Element> objects.

=cut

sub as_list {
    my $self = shift;
    my @list;
    push @list, $self->javascript_element if $self->javascript;
    push @list, $self->element            if $self->element;
    push @list, $self->error              if $self->error;
    return @list;
}

=head2 $self->element($element)

=head2 $self->field_xml

=head2 $self->element_xml

Returns xml for element.

=cut

sub element_xml {
    my $self = shift;
    return $self->element ? $self->element->as_XML : '';
}

=head2 $self->error($error)

=head2 $self->error_xml

Returns xml for error.

=cut

sub error_xml {
    my $self = shift;
    return $self->error ? $self->error->as_XML : '';
}

=head2 $self->javascript

=head2 $self->javascript_element

Returns javascript in a script L<HTML::Element>.

=cut

sub javascript_element {
    my $self    = shift;
    my $script  = HTML::Element->new( 'script', type => 'text/javascript' );
    my $content = "\n<!--\n" . $self->javascript . "\n//-->\n";
    $script->push_content($content);
    return $script;
}

=head2 $self->js_xml

=head2 $self->javascript_xml

Returns javascript in a script block.

=cut

sub javascript_xml {
    my $self = shift;
    return $self->javascript_element->as_HTML('<>&');
}

=head1 AUTHOR

Sebastian Riedel, C<sri@oook.de>

=head1 LICENSE

This library is free software, you can redistribute it and/or modify it under
the same terms as Perl itself.

=cut

1;