- my ($self, $name, $label, $checked, $attr) = @_;
-
- 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;
+ 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') {
+ $_->{checked} = shift @$checked for @$rows;
+ push @$rows, map { {checked => $_} } @$checked;
+ }
+ else {
+ $_->{checked} = $checked for @$rows;
+ }