package Template::Caribou;
our $AUTHORITY = 'cpan:YANICK';
# ABSTRACT: class-based HTML-centric templating system
$Template::Caribou::VERSION = '1.2.1';
use Carp;

use Moose::Exporter;

use Template::Caribou::Role;
use Template::Caribou::Tags qw/ attr /;

Moose::Exporter->setup_import_methods(
    with_meta => [ 'template' ],
    as_is     => [ 'attr', 'show' ],
    also      => [ 'Template::Caribou::Role' ],
);

use Moose::Util qw/ apply_all_roles /;

use 5.10.0;

sub show {
    state $shown_warning = 0;

    carp 'show() is deprecated, use $bou->my_template instead'
        unless $shown_warning++;

    $Template::Caribou::TEMPLATE->render(@_);
}

sub init_meta {
    my $class = shift;
    my %args = @_;

    my $meta = eval { $args{for_class}->meta };

    unless ( $meta ) {
        $meta = Moose->init_meta(@_);
        eval "package $args{for_class}; use Moose;";
    }

    apply_all_roles( $args{for_class}, 'Template::Caribou::Role' );

    return $meta;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Template::Caribou - class-based HTML-centric templating system

=head1 VERSION

version 1.2.1

=head1 SYNOPSIS

    package MyTemplate;

    use Template::Caribou;

    use Template::Caribou::Tags::HTML qw/ :all /;

    has name => ( is => 'ro' );

    template page => sub {
        my $self = shift;

        html { 
            head { 
                title { 'Example' } 
            };
            
            $self->my_body;
        }
    };

    template my_body => sub {
        my $self = shift;

        body { 
            h1 { 'howdie ' . $self->name } 
        }
    };

    package main;

    my $template = MyTemplate->new( name => 'Yanick' );
    print $template->page;

=head1 DESCRIPTION

WARNING: Codebase is alpha with extreme prejudice. Assume that bugs are
teeming and that the API is subject to change.

L<Template::Caribou> is a L<Moose>-based, class-centric templating system
mostly aimed at producing sgml-like outputs, mostly HTML, but also XML, SVG, etc. It is
heavily inspired by L<Template::Declare>.

For a manual on how to use C<Template::Caribou>, have a peek at
L<Template::Caribou::Manual>.

When C<use>d within a namespace, C<Template::Caribou> will apply the role L<Template::Caribou::Role>
to it (and auto-turn the namespace into Moose class if it wasn't a Moose class or role already),
as well as import the keywords C<template> and C<attr> (the latter from
L<Template::Caribou::Tags>), as well as load L<Template::Caribou::Utils>.

=head1 AUTHOR

Yanick Champoux <yanick@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by Yanick Champoux.

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

=cut
