Just wrote the following; need to work on it more but it's starting to look good and it's hella' fast. I need to get this plack thing figured out so I can stick them together.
listing of /var/www/action.pl
--------------------
#!/usr/bin/perl
use Modern::Perl;
use aXML2;
our $stash = { site_title => "bob's bit'z emporium" };
our $bob = "scalars";
my $ctr;
sub test { $ctr++; "run $ctr"; }
$_ = qq`
<aXML>
<head>
<title>[stash]->{'site_title'}[/]</title>
</head>
<body>
<h1>[stash]->{'site_title'}[/]</h1>
(test)(/)<br/>
(test)(/) () bracket commands don't cache and <br/>
(test)(/) run every time they are called <br/>
<test></><br/>
<test></> <> bracket commands do cache and retain<br/>
<test></> their value once computed <br/>
[aXML_cache]->{'test'}[/]
<br><br>
[] bracket commands interpolate values<br/>
in [bob][/] and hashrefs<br/>
<br><p>
believe it or not just those tags are all you need template<br/>
wise. Logic should be in modules, not the templates!</p>
<p>aXML2 is far less expressive than aXML, but far faster.<br/>
The aXML code gets filtered into raw perl commands then <br/>
compiled and executed by Eval::Compile resulting in<br/>
performance not far short of executing plain perl.</p>
<p>One notable loss for the sake of performance is the<br/>
ability to build complex declarations from groups of<br/>
simple ones. I am hoping to bring some of that flexibility<br/>
back as I work on the filter more. Since the code is only<br/>
filtered once on the child process startup, performance<br/>
should remain high.</p>
(aXML::Bench::EndReport)(/)
</body>
</aXML>
`;aXML2;
Listing of /etc/perl/aXML2.pm
-------------------
use Modern::Perl;
use Eval::Compile qw ( ceval );
use aXML::Bench;
our $cache;
sub aXML2
{
local $_ = $_[0] ||= $_;
&aXML::Bench::Start();
s/@/\@/gs;
s@<aXML>@print qq`Content-type: text\/html\n\n<html>@gs;
s@<\/aXML>@<\/html>`;@gs;
s@\(([^\(]+?)\)([^\(]*?)\(\/\)@`; print &$1($2); print qq`@gs;
s@\[([^\[]+?)\]([^\[]*?)\[\/\]@\$$1$2@gs;
s@<perl>@\@;@s;
s@</perl>@print qq\@@s;
s@<([^<]+?)>([^<]*?)</>@`; \$aXML_cache->{'$1'} = &$1('$2')
unless \$aXML_cache->{'$1'};
print \$aXML_cache->{'$1'};
print qq`@gs;
ceval $_;
}
1;
Listing of /etc/perl/aXML/Bench.pm
------------------------
package aXML::Bench;
use Modern::Perl;
use Time::HiRes qw ( gettimeofday tv_interval );
my ($start,$end,$elapsed,$fps);
sub MileStone { End(); my $report=Report(); Start(); return $report;}
sub EndReport { End(); return Report(); }
sub Start { $start = [ gettimeofday ]; return ""; }
sub End { $end = [ gettimeofday ]; return ""; }
sub Report
{
$end = [ gettimeofday ];
$elapsed = tv_interval($start,$end);
$fps = int(1 / $elapsed);
return "$elapsed = $fps p/s";
}
1;