The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;
use Test::More skip_all => 'not yet';

use Test::Requires qw(Data::Section::Simple);
use List::Util ();
use Text::Xslate;


{
    package C;
    use strict;
    use warnings;


    sub new {
        my ($class) = @_;
        return bless { }, $class;
    }

    sub uri_for {
        my ($self, $path) = @_;
        return 'http://example.com' . $path;
    }

    sub in_production { 1 }
}

my $tx = Text::Xslate->new(
    cache => 0,
    path  => Data::Section::Simple->new->get_data_section,
    function  => {
        array => sub {
            return List::Util::reduce {
                return $a unless $b;
                push @$a, ref $b && ref $b eq 'ARRAY' ? @$b : $b;
                $a;
            } [], @_;
        },
        is_array => sub {
            my ($obj) = @_;
            return ref $obj && ref $obj eq 'ARRAY';
        },
    },
);

ok $tx->render('index.html', {
    c => C->new,
});

done_testing;
__DATA__

@@ _tx/macros.tx
:# common macros

: macro css_tag -> $css {
<link rel="stylesheet" href="<: $css :>" />
: }

: macro script_tag -> $js {
:   if is_array($js) {
<script type="text/javascript" src="<: $js.0 :>"<: for $js.1.kv() -> $p { :> <: $p.key :><: if defined $p.value { :>="<: $p.value :>"<: } } :>></script>
:   } else {
<script type="text/javascript" src="<: $js :>"></script>
:   }
: }

@@ _tx/wrapper/base.tx
: cascade with _tx::macros
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <title><: block title { :>title<: } :></title>
: for $css -> $i { css_tag($i) }
: for $js -> $i { script_tag($i) }
  </head>
  <body>
: block body { }
  </body>
</html>

@@ _tx/wrapper.tx
: my $jquery = 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery' ~ ($c.in_production ? '.min' : '') ~ '.js';

: cascade _tx::wrapper::base {
:#   js => [$jquery, [$c.uri_for('/js/site.js'), { charset => 'utf-8' }], @$js],
:   js => array(
:     $jquery,
:     [[$c.uri_for('/js/site.js'), { charset => 'utf-8' }]],
:     $js),
:#   css => [$c.uri_for('/css/site.css'), @$css],
:   css => array(
:     $c.uri_for('/css/site.css'), $css),
: }

: around body {
<header><h1>title</h1></header>
:   block content { }
: }

@@ index.html
: cascade _tx::wrapper {
:   js => [ ],
:   css => [ ],
: }

: around content {
content
: }