package Acme::MetaSyntactic::Alias;
use strict;
use warnings;
use Carp;

our $VERSION = '1.000';

sub init {
    my ( $self, $alias ) = @_;
    my $class = caller(0);

    eval "require Acme::MetaSyntactic::$alias;";
    croak "Aliased theme Acme::MetaSyntactic::$alias failed to load: $@"
        if $@;

    no strict 'refs';
    no warnings;

    # copy almost everything over from the original
    for my $k ( grep { ! /^(?:Theme|meta|import)$/ }
        keys %{"Acme::MetaSyntactic::$alias\::"} )
    {
        *{"$class\::$k"} = *{"Acme::MetaSyntactic::$alias\::$k"};
    }

    # local things
    ${"$class\::Theme"} = ( split /::/, $class )[-1];
    ${"$class\::meta"}  = $class->new();
    *{"$class\::import"} = sub {
        my $callpkg = caller(0);
        my $theme   = ${"$class\::Theme"};
        my $meta    = $class->new();
        *{"$callpkg\::meta$theme"} = sub { $meta->name(@_) };
      };
}

1;

__END__

=head1 NAME

Acme::MetaSyntactic::Alias - Alias one theme to another

=head1 SYNOPSIS

    package Acme::MetaSyntactic::bonk;
    use Acme::MetaSyntactic::Alias;
    our @ISA = qw( Acme::MetaSyntactic::Alias );
    __PACKAGE__->init('batman');
    1;

    =head1 NAME
    
    Acme::MetaSyntactic::bonk - The bonk theme
    
    =head1 DESCRIPTION
    
    This theme is just an alias of the C<batman> theme.

    =cut
    
    # no __DATA__ section required!

=head1 DESCRIPTION

C<Acme::MetaSyntactic::Alias> is the base class for any themes that is
simply an alias of another theme.

=head1 METHOD

Acme::MetaSyntactic::Alias defines a single method, C<init()> that
make aliases very easy to write (see the full example in L<SYNOPSIS>):

=over 4

=item init( $original )

C<init()> must be called when the subclass is loaded, so as to correctly
load and alias the original theme.

C<$original> is the name of the original theme we want to alias.

=back

=head1 AUTHOR

Philippe 'BooK' Bruhat, C<< <book@cpan.org> >>

=head1 COPYRIGHT & LICENSE

Copyright 2006 Philippe 'BooK' Bruhat, All Rights Reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut