+ if (defined $attr->{id} and $attr->{id} ne '') {
+ defined $_->{id}
+ or defined $_->{value} and $_->{id} = $attr->{id}.'_'.$_->{value}
+ for @options;
+ }
+ if (defined $attr->{label}) {
+ defined $_->{value} and not defined $_->{label}
+ and $_->{label} = $attr->{label}->{$_->{value}}
+ for @options;
+ delete $attr->{label};
+ }
+ if (defined $default) {
+ for (@options) {
+ $_->{checked} = 1 if defined $_->{value} and $_->{value} eq $default;
+ }
+ }
+ $_ = {%$attr, %$_} for @options;
+ @return = map {
+ my $label = delete $_->{label};
+ defined $label && $label ne ''
+ ? '<label>'.$self->tag(input => $_)." $label</label>"
+ : $self->tag(input => $_)
+ } @options;
+ }
+
+ return wantarray ? @return : join(defined $, ? $, : '', @return);
+}
+
+sub radio {
+ my $self = shift;
+ my ($name, $label, $value, $attr) = $self->_attr(3, @_);
+
+ if (not defined $value) {
+ if (defined $label) {
+ $value = ref $label eq 'ARRAY' ? [1 .. $#$label+1] : [1];
+ }
+ else {
+ $value = [{}];
+ }
+ }
+ elsif (ref $value ne 'ARRAY') {
+ $value = [$value];