+ my $access = sub {
+ my ($element, $index, $key, $sub) = @_;
+ my $ref = ref $element;
+ return $sub ? $sub->($element)
+ : !$ref ? $element
+ : $ref eq 'ARRAY' ? $element->[$index]
+ : $ref eq 'HASH' ? $element->{$key}
+ : $element->$key;
+ };
+
+ my @elements = ();
+ push @elements, [ undef, $options{empty_title} || '' ] if $options{with_empty};
+ push @elements, map [
+ $value_title_sub ? $value_title_sub->($_) : (
+ $access->($_, 0, $value_key, $value_sub),
+ $access->($_, 1, $title_key, $title_sub),
+ )
+ ], @{ $collection } if $collection && ref $collection eq 'ARRAY';