-sub name_to_id {
- my $self = shift;
- my $name = shift;
-
- $name =~ s/[^\w_]/_/g;
- $name =~ s/_+/_/g;
-
- return $name;
-}
-
-sub attributes {
- my ($self, @slurp) = @_;
- my %options = _hashify(@slurp);
-
- my @result = ();
- while (my ($name, $value) = each %options) {
- next unless $name;
- next if $_valueless_attributes{$name} && !$value;
- $value = '' if !defined($value);
- push @result, $_valueless_attributes{$name} ? _H($name) : _H($name) . '="' . _H($value) . '"';
- }
-
- return @result ? ' ' . join(' ', @result) : '';
-}
-
-sub html_tag {
- my ($self, $tag, $content, @slurp) = @_;
- my $attributes = $self->attributes(@slurp);
-
- return "<${tag}${attributes}>" unless defined($content);
- return "<${tag}${attributes}>${content}</${tag}>";
-}
-
-sub select_tag {
- my $self = shift;
- my $name = shift;
- my $collection = shift;
- my %attributes = _hashify(@_);
-
- $attributes{id} ||= $self->name_to_id($name);
-
- my $value_key = delete($attributes{value_key}) || 'id';
- my $title_key = delete($attributes{title_key}) || $value_key;
- my $default_key = delete($attributes{default_key}) || 'selected';
-
-
- my $value_title_sub = delete($attributes{value_title_sub});
-
- my $value_sub = delete($attributes{value_sub});
- my $title_sub = delete($attributes{title_sub});
- my $default_sub = delete($attributes{default_sub});
-
-
- my %selected;
-
- if ( ref($attributes{default}) eq 'ARRAY' ) {
-
- foreach my $entry (@{$attributes{default}}) {
- $selected{$entry} = 1;
- }
- } elsif ( defined($attributes{default}) ) {
- $selected{$attributes{default}} = 1;
- }
-
- delete($attributes{default});
-
-
- my @options;
-
- if ( delete($attributes{with_empty}) ) {
- push(@options, [undef, $attributes{empty_title} || '']);
- }
-
- my $normalize_entry = sub {
-
- my ($type, $entry, $sub, $key) = @_;
-
- if ( $sub ) {
- return $sub->($entry);
- }
-
- my $ref = ref($entry);
-
- if ( !$ref ) {
-
- if ( $type eq 'value' || $type eq 'title' ) {
- return $entry;
- }
-
- return 0;
- }
-
- if ( $ref eq 'ARRAY' ) {
-
- if ( $type eq 'value' ) {
- return $entry->[0];
- }
-
- if ( $type eq 'title' ) {
- return $entry->[1];
- }
-
- return $entry->[2];
- }
-
- if ( $ref eq 'HASH' ) {
- return $entry->{$key};
- }
-
- if ( $type ne 'default' || $entry->can($key) ) {
- return $entry->$key;
- }
-
- return undef;
- };
-
- foreach my $entry ( @{ $collection } ) {
- my $value;
- my $title;