summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
be81b5d)
Nearly all methods adhere to the same peculiar shorthand of allowing
several optional arguments, but always expecting a trailing hashref to
be attribute options. For various reasons, this is better abstracted.
The only significant behavioural change is that the first arguments to
input() can now be overridden with option values if undef (which seems
only logical).
+sub _attr {
+ my $self = shift;
+ my $expect = shift;
+ my $attr = ref $_[-1] eq 'HASH' ? pop : {};
+ push @_, undef for @_+1 .. $expect;
+ push @_, $attr;
+ return @_;
+}
+
sub quote {
my $self = shift;
return XML::Quote::xml_quote_min($_[0]);
sub quote {
my $self = shift;
return XML::Quote::xml_quote_min($_[0]);
- my ($self, $value, $attr) = @_;
-
- if (ref $value eq 'HASH') {
- $attr = $value;
- }
- else {
- $attr ||= {};
- $attr->{value} = $value;
- }
+ my $self = shift;
+ my ($value, $attr) = $self->_attr(1, @_);
+ $attr->{value} = $value if defined $value;
$attr->{type} = 'submit' unless defined $attr->{type};
return $self->tag(input => $attr);
}
sub hidden {
$attr->{type} = 'submit' unless defined $attr->{type};
return $self->tag(input => $attr);
}
sub hidden {
- my ($self, $name, $value) = @_;
+ my $self = shift;
+ my ($name, $value, $attr) = $self->_attr(2, @_);
+ $attr = {type => 'hidden', name => $name, value => $value};
- return $self->tag(input => {type => 'hidden', name => $name, value => $value});
+ return $self->tag(input => $attr);
- my ($self, $name, $value, $attr) = @_;
-
- if (ref $name eq 'HASH') {
- # only attributes provided (first argument)
- $attr = $name;
- }
- elsif (ref $value eq 'HASH') {
- # name shorthand (attributes in value parameter)
- $attr = $value;
- $attr->{name} = $name;
- }
- else {
- # name and value shorthands (all vars keep their assigned values)
- $attr ||= {};
- $attr->{name} = $name;
- $attr->{value} = $value;
- }
+ my $self = shift;
+ my ($name, $value, $attr) = $self->_attr(2, @_);
+ $attr->{name } = $name if defined $name;
+ $attr->{value} = $value if defined $value;
$attr->{id} = $attr->{name} unless defined $attr->{id};
$attr->{type} = 'text' unless defined $attr->{type} or defined $attr->{rows};
$value = delete $attr->{value} if defined $attr->{rows};
$attr->{id} = $attr->{name} unless defined $attr->{id};
$attr->{type} = 'text' unless defined $attr->{type} or defined $attr->{rows};
$value = delete $attr->{value} if defined $attr->{rows};
- my ($self, $name, $rows, $value, $attr) = @_;
+ my $self = shift;
+ my ($name, $rows, $default, $attr) = $self->_attr(3, @_);
+
+ $default = $attr->{value} unless defined $default;
+ delete $attr->{value}; # never a parent attribute
- if (ref $value eq 'HASH') {
- $attr = $value;
- $value = delete $attr->{value};
- }
- else {
- $attr ||= {};
- delete $attr->{value};
- }
$attr->{name} = $name;
$attr->{id} = $attr->{name} unless defined $attr->{id};
$attr->{type} = 'select' unless defined $attr->{type};
$attr->{name} = $name;
$attr->{id} = $attr->{name} unless defined $attr->{id};
$attr->{type} = 'select' unless defined $attr->{type};
if ($attr->{type} eq 'select') {
delete $attr->{type};
if ($attr->{type} eq 'select') {
delete $attr->{type};
+ if (defined $default) {
- $_->{selected} = 1 if defined $_->{value} and $_->{value} eq $value;
+ $_->{selected} = 1 if defined $_->{value} and $_->{value} eq $default;
for @options;
delete $attr->{label};
}
for @options;
delete $attr->{label};
}
+ if (defined $default) {
- $_->{checked} = 1 if defined $_->{value} and $_->{value} eq $value;
+ $_->{checked} = 1 if defined $_->{value} and $_->{value} eq $default;
}
}
$_ = {%$attr, %$_} for @options;
}
}
$_ = {%$attr, %$_} for @options;
- my ($self, $name, $value, $attr) = @_;
-
- if (ref $value eq 'HASH') {
- $attr = $value;
- }
- else {
- $attr ||= {};
- $attr->{value} = $value;
- }
+ my $self = shift;
+ my ($name, $value, $attr) = $self->_attr(2, @_);
- $self->select($name, [$attr], {type => 'radio'});
+ $self->select($name, [$value], {%$attr, type => 'radio'});
- my ($self, $name, $label, $checked, $attr) = @_;
+ my $self = shift;
+ my ($name, $label, $checked, $attr) = $self->_attr(3, @_);
- if (ref $label eq 'HASH') {
- $attr = $label;
- undef $label;
- }
- elsif (ref $checked eq 'HASH') {
- $attr = $checked;
- $attr->{label} = $label;
- }
- else {
- $attr ||= {};
- $attr->{checked} = $checked;
- $attr->{label} = $label;
- }
- $attr->{value} = '1' unless exists $attr->{value};
+ $attr->{label } = $label if defined $label;
+ $attr->{checked} = $checked if defined $checked;
+ $attr->{value } = '1' unless exists $attr->{value};
$self->select($name, [$attr], {type => 'checkbox'});
}
$self->select($name, [$attr], {type => 'checkbox'});
}
- $form->input('', '', {disabled => 0, something => undef, class => undef, style => ''}),
+ $form->input('', '', {
+ disabled => 0,
+ something => undef,
+ class => undef,
+ style => '',
+ name => 'ignore',
+ value => 'overrides',
+ }),
'<input name="" type="text" value="">',
'input with empty attributes'
);
is(
'<input name="" type="text" value="">',
'input with empty attributes'
);
is(
- $form->input(undef, undef, {name => 'override', value => 'override'}),
- '<input type="text">',
- 'ignore input overrides'
+ $form->input(undef, undef, {name => '0', value => '0'}),
+ '<input id="0" name="0" type="text" value="0">',
+ 'input overrides'