use strict;
use warnings;
package HTML::Widget::Plugin::Button;
use HTML::Widget::Plugin ();
BEGIN { our @ISA = 'HTML::Widget::Plugin' };
our $VERSION = '0.082';
=head1 NAME
HTML::Widget::Plugin::Button - a button for clicking
=head1 SYNOPSIS
$widget_factory->button({
text => "submit & continue",
type => 'submit',
});
...or...
$widget_factory->button({
html => "reset all content",
type => 'reset',
});
=head1 DESCRIPTION
This plugin provides a basic button widget.
=cut
use HTML::Element;
=head1 METHODS
=head2 C< provided_widgets >
This plugin provides the following widgets: input
=cut
sub provided_widgets { qw(button) }
=head2 C< button >
This method returns simple button element.
In addition to the generic L attributes, the following
are valid arguments:
=over
=item text
=item html
One of these options may be provided. If text is provided, it is used as the
content of the button, after being entity encoded. If html is provided, it is
used as the content of the button with no encoding performed.
=item type
This is the type of input button to be created. Valid types are button,
submit, and reset. The default is button.
=item value
This is the widget's initial value.
=back
=cut
sub _attribute_args { qw(type value) }
sub _boolean_args { qw(disabled) }
sub button {
my ($self, $factory, $arg) = @_;
$self->build($factory, $arg);
}
=head2 C< build >
my $widget = $class->build($factory, $arg);
This method does the actual construction of the input based on the args
collected by the widget-constructing method. It is primarily here for
subclasses to exploit.
=cut
my %TYPES = map { $_ => 1 } qw(button reset submit);
sub __is_valid_type {
my ($self, $type) = @_;
return exists $TYPES{ $type };
}
sub build {
my ($self, $factory, $arg) = @_;
$arg->{attr}{name} = $arg->{attr}{id} if not defined $arg->{attr}{name};
$arg->{attr}{type} ||= 'button';
Carp::croak "invalid button type: $arg->{attr}{type}"
unless $self->__is_valid_type($arg->{attr}{type});
Carp::croak "text and html arguments for link widget are mutually exclusive"
if $arg->{text} and $arg->{html};
my $widget = HTML::Element->new('button');
$widget->attr($_ => $arg->{attr}{$_}) for keys %{ $arg->{attr} };
my $content;
if ($arg->{html}) {
$content = ref $arg->{html}
? $arg->{html}
: HTML::Element->new('~literal' => text => $arg->{html});
} else {
$content = defined $arg->{text}
? $arg->{text}
: ucfirst lc $arg->{attr}{type};
}
$widget->push_content($content);
return $widget->as_XML;
}
=head1 AUTHOR
Ricardo SIGNES >
=head1 COPYRIGHT
Copyright (C) 2007, Ricardo SIGNES. This is free software, released under the
same terms as perl itself.
=cut
1;