The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Template::Declare::TagSet;

use strict;
use warnings;
use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_ro_accessors(
    qw{ namespace package implementor }
);

sub get_alternate_spelling {
    undef;
}

sub get_tag_list {
    [];
}

# specify whether "<tag></tag>" can be combined to "<tag />"
sub can_combine_empty_tags {
    1;
}

1;
__END__

=head1 NAME

Template::Declare::TagSet - Base class for tag set classes used by Template::Declare::Tags

=head1 SYNOPSIS

    package My::TagSet;
    use base 'Template::Declare::TagSet';

    # returns an array ref for the tag names
    sub get_tag_list {
        [ qw/ html body tr td table
             base meta link hr
            / ]
    }

    # prevents potential naming conflicts:
    sub get_alternate_spelling {
        my ($self, $tag) = @_;
        return 'row' if $tag eq 'tr';
        return 'cell' if $tag eq 'td';
    }

    # Specifies whether "<tag></tag>" can be
    # combined to "<tag />":
    sub can_combine_empty_tags {
        my ($self, $tag) = @_;
        $tag =~ /^ base | meta | link | hr $/x;
    }

=head1 METHODS

=over

=item C<< $obj = Template::Declare::TagSet->new({ package => 'Foo::Bar', namespace => undef }); >>

Constructor created by C<Class::Accessor::Fast>,
accepting an optional option list.

=item C<< $list = $obj->get_tag_list() >>

Returns an array ref for the tag names.

=item C<< $bool = $obj->get_alternate_spelling($tag) >>

Returns whether a tag has an alternative spelling. Basically
it provides a way to work around naming conflicts, for
examples, the C<tr> tag in HTML conflicts with the C<tr>
operator in Perl and the C<template> tag in XUL conflicts
with the C<template> sub exported by C<Template::Declare::Tags>.

=item C<< $bool = $obj->can_combine_empty_tags($tag) >>

Specifies whether "<tag></tag>" can be combined into a single
token "<tag />".

Always returns true (value 1) in this base class.

But there's some cases where you want to override the
deafault implementation. For example,
C<< Template::Declare::TagSet::HTML->can_combine_empty_tags('img') >> returns true (1) since C<< <img src="..." /> >> is always
required for HTML pages.

=back

=head1 ACCESSORS

This class has two read-only accessors:

=over

=item C<< $obj->package() >>

Retrieves the value of the C<package> option set via
the constructor.

=item C<< $obj->namespace() >>

Retrieves the value of the C<namespace> option set by
the constructor.

=back

=head1 AUTHOR

Agent Zhang <agentzh@yahoo.cn>.

=head1 SEE ALSO

L<Template::Declare::TagSet::HTML>, L<Template::Declare::TagSet::XUL>, L<Template::Declare::Tags>,
L<Template::Declare>.