+ return wantarray ? @return : join(defined $, ? $, : '', @return);
+}
+
+sub radio {
+ my $self = shift;
+ my ($name, $rows, $label, $attr) = $self->_attr(3, @_);
+
+ if (not defined $rows) {
+ if (defined $label) {
+ $rows = ref $label eq 'ARRAY' ? [1 .. $#$label+1] : [1];
+ }
+ else {
+ $rows = [{}];
+ }
+ }
+ elsif (ref $rows ne 'ARRAY') {
+ $rows = [$rows];
+ }
+
+ if (defined $label) {
+ $rows = [ map { ref $_ eq 'HASH' ? {%$_} : {value => $_} } @$rows ];
+ if (ref $label eq 'ARRAY') {
+ $rows->[$_]->{label} = $label->[$_] for 0 .. $#$rows;
+ } else {
+ $_->{label} = $label for @$rows;
+ }
+ }
+
+ $self->select($name, $rows, {%$attr, type => 'radio'});
+}
+
+sub check {
+ my $self = shift;
+ my ($name, $label, $checked, $attr) = $self->_attr(3, @_);
+
+ my $rows = defined $label ? ref $label eq 'ARRAY' ? [@$label] : [$label] : [{}];
+ ref $_ eq 'HASH' or $_ = {label => $_} for @$rows;
+ if (defined $checked) {
+ if (ref $checked eq 'ARRAY') {
+ $rows->[$_]->{checked} = $checked->[$_] for 0 .. $#$rows;
+ push @$rows, map { {checked => $_} } @$checked[@$rows .. $#$checked];
+ }
+ else {
+ $_->{checked} = $checked for @$rows;
+ }
+ }
+ exists $rows->[$_]->{value} or $rows->[$_]->{value} = $_ + 1 for 0 .. $#$rows;
+ $rows->[0]->{id} = $attr->{id} || $rows->[0]->{name} || $attr->{name} || $name #XXX: //
+ if ref $label ne 'ARRAY' and defined $rows->[0] and not defined $rows->[0]->{id};
+
+ $self->select($name, $rows, {%$attr, type => 'checkbox'});