token_re, include cleanup, git cleanup
Uri Guttman [Wed, 9 May 2012 07:20:28 +0000 (03:20 -0400)]
14 files changed:
Changes
MANIFEST
Makefile
bench.pl [deleted file]
bench_all.pl [deleted file]
comp.pl [deleted file]
extras/bench_all.pl [moved from extras/bench_new.pl with 75% similarity, mode: 0644]
extras/cookbook.pl [new file with mode: 0644]
s5-blank.zip [deleted file]
t/common.pm
t/error.t
t/include.t
t/nested.t
t/top.t

diff --git a/Changes b/Changes
index 177ebbb..56199de 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,30 @@
 Revision history for Template-Simple
 
+0.06   Tue May  8 01:53:46 EDT 2012
+       Added support for markup tokens to use a user supplied regex
+       Thanks to Rick Morse
+               
+0.05   Sun Apr 24 00:27:10 EDT 2011
+      - Updated Changes file
+      - Added handling of undef templates
+      - Added new benchmark in extras/bench_all.pl
+0.05   Fri Jun 24 14:22:58 EDT 2011
+       Wrote new benchmark script in extras/
+       Added to distro modified Template::Teeny for benchmark
+
+0.04    Sun Apr 24 00:27:10 EDT 2011
+      - Fixed bugs in tests (introduced in 0.03)
+
+0.03    Sun Apr  3 04:11:04 EDT 2011
+      - Added support for compiled templates
+      - Added support to test regular and compiled templates
+      - Improved shared test driver t/common.pm
+      - include_paths constructor option now called template_paths
+       include_paths is still supported but deprecated
+      - Major edits and cleanup of pod
+      - Created extras/cookbook.pl with runnable T::S examples and pod
+      - Added extras/bench_all.pl which benchmarks several templaters
+
 0.02    Tue Oct 17 02:08:28 EDT 2006
       - Fixed bug with nested hashes being rendered. Added nested.t to
        the tests.
@@ -7,5 +32,3 @@ Revision history for Template-Simple
 
 0.01    Sun Aug 27 00:07:13 EDT 2006
         First release
-
-
index 80ecf65..b5b000a 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3,6 +3,7 @@ MANIFEST
 META.yml # Will be created by "make dist"
 Makefile.PL
 README
+TODO
 lib/Template/Simple.pm
 t/00-load.t
 t/boilerplate.t
@@ -15,3 +16,7 @@ t/options.t
 t/include.t
 t/error.t
 t/common.pm
+extras/cookbook.pl
+extras/bench_all.pl
+extras/lib/Template/Teeny.pm
+extras/lib/Template/Teeny/Stash.pm
index db8b045..d99ea81 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,19 @@
 # This Makefile is for the Template::Simple extension to perl.
 #
 # It was generated automatically by MakeMaker version
-# 6.17 (Revision: 1.133) from the contents of
+# 6.55_02 (Revision: 65502) from the contents of
 # Makefile.PL. Don't edit this file, edit Makefile.PL instead.
 #
 #       ANY CHANGES MADE HERE WILL BE LOST!
 #
 #   MakeMaker ARGV: ()
 #
+
 #   MakeMaker Parameters:
 
 #     ABSTRACT_FROM => q[lib/Template/Simple.pm]
 #     AUTHOR => q[Uri Guttman <uri@sysarch.com>]
+#     BUILD_REQUIRES => {  }
 #     NAME => q[Template::Simple]
 #     PL_FILES => {  }
 #     PREREQ_PM => { Test::More=>q[0], File::Slurp=>q[0] }
 
 # --- MakeMaker const_config section:
 
-# These definitions are from config.sh (via /usr/local/lib/perl5/5.8.6/sun4-solaris/Config.pm)
-
-# They may have been overridden via Makefile.PL or on the command line
+# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm).
+# They may have been overridden via Makefile.PL or on the command line.
 AR = ar
-CC = gcc
+CC = cc
 CCCDLFLAGS = -fPIC
-CCDLFLAGS =  
+CCDLFLAGS = -Wl,-E
 DLEXT = so
 DLSRC = dl_dlopen.xs
-LD = gcc
-LDDLFLAGS = -G -L/usr/local/lib
-LDFLAGS =  -L/usr/local/lib 
-LIBC = /lib/libc.so
+EXE_EXT = 
+FULL_AR = /usr/bin/ar
+LD = cc
+LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector
+LDFLAGS =  -fstack-protector -L/usr/local/lib
+LIBC = 
 LIB_EXT = .a
 OBJ_EXT = .o
-OSNAME = solaris
-OSVERS = 2.9
+OSNAME = linux
+OSVERS = 2.6.24-28-server
 RANLIB = :
-SITELIBEXP = /usr/local/lib/perl5/site_perl/5.8.6
-SITEARCHEXP = /usr/local/lib/perl5/site_perl/5.8.6/sun4-solaris
+SITELIBEXP = /usr/local/share/perl/5.10.1
+SITEARCHEXP = /usr/local/lib/perl/5.10.1
 SO = so
-EXE_EXT = 
-FULL_AR = /usr/ccs/bin/ar
-VENDORARCHEXP = 
-VENDORLIBEXP = 
+VENDORARCHEXP = /usr/lib/perl5
+VENDORLIBEXP = /usr/share/perl5
 
 
 # --- MakeMaker constants section:
 AR_STATIC_ARGS = cr
 DIRFILESEP = /
+DFSEP = $(DIRFILESEP)
 NAME = Template::Simple
 NAME_SYM = Template_Simple
-VERSION = 0.02
+VERSION = 0.06
 VERSION_MACRO = VERSION
-VERSION_SYM = 0_02
+VERSION_SYM = 0_06
 DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
-XS_VERSION = 0.02
+XS_VERSION = 0.06
 XS_VERSION_MACRO = XS_VERSION
 XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
 INST_ARCHLIB = blib/arch
@@ -69,56 +71,60 @@ INST_BIN = blib/bin
 INST_LIB = blib/lib
 INST_MAN1DIR = blib/man1
 INST_MAN3DIR = blib/man3
-MAN1EXT = 1
-MAN3EXT = 3
+MAN1EXT = 1p
+MAN3EXT = 3pm
 INSTALLDIRS = site
 DESTDIR = 
-PREFIX = 
-PERLPREFIX = /usr/local
-SITEPREFIX = /usr/local
-VENDORPREFIX = 
-INSTALLPRIVLIB = $(PERLPREFIX)/lib/perl5/5.8.6
+PREFIX = /usr
+PERLPREFIX = $(PREFIX)
+SITEPREFIX = $(PREFIX)/local
+VENDORPREFIX = $(PREFIX)
+INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10
 DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
-INSTALLSITELIB = $(SITEPREFIX)/lib/perl5/site_perl/5.8.6
+INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1
 DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
-INSTALLVENDORLIB = 
+INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
 DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
-INSTALLARCHLIB = $(PERLPREFIX)/lib/perl5/5.8.6/sun4-solaris
+INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10
 DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
-INSTALLSITEARCH = $(SITEPREFIX)/lib/perl5/site_perl/5.8.6/sun4-solaris
+INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1
 DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
-INSTALLVENDORARCH = 
+INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
 DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
 INSTALLBIN = $(PERLPREFIX)/bin
 DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
 INSTALLSITEBIN = $(SITEPREFIX)/bin
 DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
-INSTALLVENDORBIN = 
+INSTALLVENDORBIN = $(VENDORPREFIX)/bin
 DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
 INSTALLSCRIPT = $(PERLPREFIX)/bin
 DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
-INSTALLMAN1DIR = $(PERLPREFIX)/man/man1
+INSTALLSITESCRIPT = $(SITEPREFIX)/bin
+DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
+INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin
+DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
+INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
 DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
 INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
 DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
-INSTALLVENDORMAN1DIR = 
+INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
 DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
-INSTALLMAN3DIR = $(PERLPREFIX)/man/man3
+INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
 DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
 INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
 DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
-INSTALLVENDORMAN3DIR = 
+INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
 DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
-PERL_LIB = /usr/local/lib/perl5/5.8.6
-PERL_ARCHLIB = /usr/local/lib/perl5/5.8.6/sun4-solaris
+PERL_LIB = /usr/share/perl/5.10
+PERL_ARCHLIB = /usr/lib/perl/5.10
 LIBPERL_A = libperl.a
 FIRST_MAKEFILE = Makefile
-MAKEFILE_OLD = $(FIRST_MAKEFILE).old
-MAKE_APERL_FILE = $(FIRST_MAKEFILE).aperl
+MAKEFILE_OLD = Makefile.old
+MAKE_APERL_FILE = Makefile.aperl
 PERLMAINCC = $(CC)
-PERL_INC = /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE
-PERL = /usr/local/bin/perl
-FULLPERL = /usr/local/bin/perl
+PERL_INC = /usr/lib/perl/5.10/CORE
+PERL = /usr/bin/perl
+FULLPERL = /usr/bin/perl
 ABSPERL = $(PERL)
 PERLRUN = $(PERL)
 FULLPERLRUN = $(FULLPERL)
@@ -127,17 +133,19 @@ PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
 FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
 ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
 PERL_CORE = 0
+PERM_DIR = 755
 PERM_RW = 644
 PERM_RWX = 755
 
-MAKEMAKER   = /usr/local/lib/perl5/5.8.6/ExtUtils/MakeMaker.pm
-MM_VERSION  = 6.17
-MM_REVISION = 1.133
+MAKEMAKER   = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm
+MM_VERSION  = 6.55_02
+MM_REVISION = 65502
 
 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
 # DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
+MAKE = make
 FULLEXT = Template/Simple
 BASEEXT = Simple
 PARENT_NAME = Template
@@ -146,6 +154,7 @@ VERSION_FROM = lib/Template/Simple.pm
 OBJECT = 
 LDFROM = $(OBJECT)
 LINKTYPE = dynamic
+BOOTDEP = 
 
 # Handy lists of source code files:
 XS_FILES = 
@@ -156,7 +165,7 @@ MAN1PODS =
 MAN3PODS = lib/Template/Simple.pm
 
 # Where is the Config information that we are using/depend on
-CONFIGDEP = $(PERL_ARCHLIB)$(DIRFILESEP)Config.pm $(PERL_INC)$(DIRFILESEP)config.h
+CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
 
 # Where to build things
 INST_LIBDIR      = $(INST_LIB)/Template
@@ -175,26 +184,26 @@ PERL_ARCHIVE       =
 PERL_ARCHIVE_AFTER = 
 
 
-TO_INST_PM = bug.pl \
-       lib/Template/Simple.pm \
-       lib/Template/Simple.pm.expnad
+TO_INST_PM = lib/14094525_16586370.gwqa \
+       lib/Template/14094525_16586370.gwqa \
+       lib/Template/Simple.pm
 
-PM_TO_BLIB = lib/Template/Simple.pm.expnad \
-       blib/lib/Template/Simple.pm.expnad \
-       bug.pl \
-       $(INST_LIB)/Template/bug.pl \
+PM_TO_BLIB = lib/Template/14094525_16586370.gwqa \
+       blib/lib/Template/14094525_16586370.gwqa \
        lib/Template/Simple.pm \
-       blib/lib/Template/Simple.pm
+       blib/lib/Template/Simple.pm \
+       lib/14094525_16586370.gwqa \
+       blib/lib/14094525_16586370.gwqa
 
 
 # --- MakeMaker platform_constants section:
-MM_Unix_VERSION = 1.42
+MM_Unix_VERSION = 6.55_02
 PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
 
 
 # --- MakeMaker tool_autosplit section:
 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
-AUTOSPLITFILE = $(PERLRUN)  -e 'use AutoSplit;  autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)'
+AUTOSPLITFILE = $(ABSPERLRUN)  -e 'use AutoSplit;  autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' --
 
 
 
@@ -206,7 +215,7 @@ SHELL = /bin/sh
 CHMOD = chmod
 CP = cp
 MV = mv
-NOOP = $(SHELL) -c true
+NOOP = $(TRUE)
 NOECHO = @
 RM_F = rm -f
 RM_RF = rm -rf
@@ -214,20 +223,26 @@ TEST_F = test -f
 TOUCH = touch
 UMASK_NULL = umask 0
 DEV_NULL = > /dev/null 2>&1
-MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath
-EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime
+MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' --
+EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' --
+FALSE = false
+TRUE = true
 ECHO = echo
 ECHO_N = echo -n
 UNINST = 0
 VERBINST = 0
-MOD_INSTALL = $(PERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\''$(VERBINST)'\'', 0, '\''$(UNINST)'\'');'
-DOC_INSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e perllocal_install
-UNINSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e uninstall
-WARN_IF_OLD_PACKLIST = $(PERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist
+MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' --
+DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' --
+UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' --
+WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' --
+MACROSTART = 
+MACROEND = 
+USEMAKEFILE = -f
+FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' --
 
 
 # --- MakeMaker makemakerdflt section:
-makemakerdflt: all
+makemakerdflt : all
        $(NOECHO) $(NOOP)
 
 
@@ -247,7 +262,7 @@ RCS_LABEL = rcs -Nv$(VERSION_SYM): -q
 DIST_CP = best
 DIST_DEFAULT = tardist
 DISTNAME = Template-Simple
-DISTVNAME = Template-Simple-0.02
+DISTVNAME = Template-Simple-0.06
 
 
 # --- MakeMaker macro section:
@@ -270,19 +285,15 @@ DISTVNAME = Template-Simple-0.02
 
 # --- MakeMaker pasthru section:
 
-PASTHRU = LIB="$(LIB)"\
-       LIBPERL_A="$(LIBPERL_A)"\
+PASTHRU = LIBPERL_A="$(LIBPERL_A)"\
        LINKTYPE="$(LINKTYPE)"\
-       PREFIX="$(PREFIX)"\
-       OPTIMIZE="$(OPTIMIZE)"\
-       PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\
-       PASTHRU_INC="$(PASTHRU_INC)"
+       PREFIX="$(PREFIX)"
 
 
 # --- MakeMaker special_targets section:
-.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
 
-.PHONY: all config static dynamic test linkext manifest
+.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
 
 
 
@@ -306,45 +317,61 @@ pure_all :: config pm_to_blib subdirs linkext
 subdirs :: $(MYEXTLIB)
        $(NOECHO) $(NOOP)
 
-config :: $(FIRST_MAKEFILE) $(INST_LIBDIR)$(DIRFILESEP).exists
+config :: $(FIRST_MAKEFILE) blibdirs
        $(NOECHO) $(NOOP)
 
-config :: $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
-       $(NOECHO) $(NOOP)
+help :
+       perldoc ExtUtils::MakeMaker
 
-config :: $(INST_AUTODIR)$(DIRFILESEP).exists
-       $(NOECHO) $(NOOP)
 
-$(INST_AUTODIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
-       $(NOECHO) $(MKPATH) $(INST_AUTODIR)
-       $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_AUTODIR)/.exists
+# --- MakeMaker blibdirs section:
+blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists
+       $(NOECHO) $(NOOP)
 
-       -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_AUTODIR)
+# Backwards compat with 6.18 through 6.25
+blibdirs.ts : blibdirs
+       $(NOECHO) $(NOOP)
 
-$(INST_LIBDIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL
        $(NOECHO) $(MKPATH) $(INST_LIBDIR)
-       $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_LIBDIR)/.exists
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR)
+       $(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists
+
+$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL
+       $(NOECHO) $(MKPATH) $(INST_ARCHLIB)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB)
+       $(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists
 
-       -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_LIBDIR)
+$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL
+       $(NOECHO) $(MKPATH) $(INST_AUTODIR)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR)
+       $(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists
 
-$(INST_ARCHAUTODIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL
        $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
-       $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_ARCHAUTODIR)/.exists
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR)
+       $(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists
 
-       -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR)
+$(INST_BIN)$(DFSEP).exists :: Makefile.PL
+       $(NOECHO) $(MKPATH) $(INST_BIN)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN)
+       $(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists
 
-config :: $(INST_MAN3DIR)$(DIRFILESEP).exists
-       $(NOECHO) $(NOOP)
+$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL
+       $(NOECHO) $(MKPATH) $(INST_SCRIPT)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT)
+       $(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists
 
+$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL
+       $(NOECHO) $(MKPATH) $(INST_MAN1DIR)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR)
+       $(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists
 
-$(INST_MAN3DIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL
        $(NOECHO) $(MKPATH) $(INST_MAN3DIR)
-       $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_MAN3DIR)/.exists
-
-       -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_MAN3DIR)
+       $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR)
+       $(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists
 
-help:
-       perldoc ExtUtils::MakeMaker
 
 
 # --- MakeMaker linkext section:
@@ -388,9 +415,8 @@ POD2MAN = $(POD2MAN_EXE)
 
 
 manifypods : pure_all  \
-       lib/Template/Simple.pm \
        lib/Template/Simple.pm
-       $(NOECHO) $(POD2MAN) --section=3 --perm_rw=$(PERM_RW)\
+       $(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW) \
          lib/Template/Simple.pm $(INST_MAN3DIR)/Template::Simple.$(MAN3EXT) 
 
 
@@ -417,8 +443,25 @@ clean_subdirs :
 # the Makefile here so a later make realclean still has a makefile to use.
 
 clean :: clean_subdirs
-       -$(RM_RF) Template-Simple-* ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all $(INST_ARCHAUTODIR)/extralibs.ld perlmain.c tmon.out mon.out so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def $(BASEEXT).exp $(BASEEXT).x core core.*perl.*.? *perl.core core.[0-9] core.[0-9][0-9] core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9][0-9]
-       -$(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+       - $(RM_F) \
+         *$(LIB_EXT) core \
+         core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \
+         core.[0-9][0-9] $(BASEEXT).bso \
+         pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
+         $(BASEEXT).x $(BOOTSTRAP) \
+         perl$(EXE_EXT) tmon.out \
+         *$(OBJ_EXT) pm_to_blib \
+         $(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \
+         core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
+         core.*perl.*.? $(MAKE_APERL_FILE) \
+         perl $(BASEEXT).def \
+         core.[0-9][0-9][0-9] mon.out \
+         lib$(BASEEXT).def perlmain.c \
+         perl.exe so_locations \
+         $(BASEEXT).exp 
+       - $(RM_RF) \
+         Template-Simple-* blib 
+       - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
 
 
 # --- MakeMaker realclean_subdirs section:
@@ -427,34 +470,46 @@ realclean_subdirs :
 
 
 # --- MakeMaker realclean section:
-
-# Delete temporary files (via clean) and also delete installed files
+# Delete temporary files (via clean) and also delete dist files
 realclean purge ::  clean realclean_subdirs
-       $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
-       $(RM_RF) $(DISTVNAME)
-       $(RM_F)  $(INST_LIB)/Template/bug.pl blib/lib/Template/Simple.pm.expnad blib/lib/Template/Simple.pm $(MAKEFILE_OLD) $(FIRST_MAKEFILE)
+       - $(RM_F) \
+         $(MAKEFILE_OLD) $(FIRST_MAKEFILE) 
+       - $(RM_RF) \
+         $(DISTVNAME) 
 
 
 # --- MakeMaker metafile section:
-metafile :
-       $(NOECHO) $(ECHO) '# http://module-build.sourceforge.net/META-spec.html' > META.yml
-       $(NOECHO) $(ECHO) '#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#' >> META.yml
-       $(NOECHO) $(ECHO) 'name:         Template-Simple' >> META.yml
-       $(NOECHO) $(ECHO) 'version:      0.02' >> META.yml
-       $(NOECHO) $(ECHO) 'version_from: lib/Template/Simple.pm' >> META.yml
-       $(NOECHO) $(ECHO) 'installdirs:  site' >> META.yml
-       $(NOECHO) $(ECHO) 'requires:' >> META.yml
-       $(NOECHO) $(ECHO) '    File::Slurp:                   0' >> META.yml
-       $(NOECHO) $(ECHO) '    Test::More:                    0' >> META.yml
-       $(NOECHO) $(ECHO) '' >> META.yml
-       $(NOECHO) $(ECHO) 'distribution_type: module' >> META.yml
-       $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.17' >> META.yml
-
-
-# --- MakeMaker metafile_addtomanifest section:
-metafile_addtomanifest:
-       $(NOECHO) $(PERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
-       -e '    or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"'
+metafile : create_distdir
+       $(NOECHO) $(ECHO) Generating META.yml
+       $(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml
+       $(NOECHO) $(ECHO) 'name:               Template-Simple' >> META_new.yml
+       $(NOECHO) $(ECHO) 'version:            0.06' >> META_new.yml
+       $(NOECHO) $(ECHO) 'abstract:           A simple and very fast template module' >> META_new.yml
+       $(NOECHO) $(ECHO) 'author:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    - Uri Guttman <uri@sysarch.com>' >> META_new.yml
+       $(NOECHO) $(ECHO) 'license:            unknown' >> META_new.yml
+       $(NOECHO) $(ECHO) 'distribution_type:  module' >> META_new.yml
+       $(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    ExtUtils::MakeMaker:  0' >> META_new.yml
+       $(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    ExtUtils::MakeMaker:  0' >> META_new.yml
+       $(NOECHO) $(ECHO) 'requires:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    File::Slurp:  0' >> META_new.yml
+       $(NOECHO) $(ECHO) '    Test::More:   0' >> META_new.yml
+       $(NOECHO) $(ECHO) 'no_index:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    directory:' >> META_new.yml
+       $(NOECHO) $(ECHO) '        - t' >> META_new.yml
+       $(NOECHO) $(ECHO) '        - inc' >> META_new.yml
+       $(NOECHO) $(ECHO) 'generated_by:       ExtUtils::MakeMaker version 6.55_02' >> META_new.yml
+       $(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml
+       $(NOECHO) $(ECHO) '    url:      http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml
+       $(NOECHO) $(ECHO) '    version:  1.4' >> META_new.yml
+       -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+
+
+# --- MakeMaker signature section:
+signature :
+       cpansign -s
 
 
 # --- MakeMaker dist_basics section:
@@ -471,15 +526,15 @@ manifest :
        $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
 
 veryclean : realclean
-       $(RM_F) *~ *.orig */*~ */*.orig
+       $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old 
 
 
 
 # --- MakeMaker dist_core section:
 
 dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
-       $(NOECHO) $(PERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
-       -e '    if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';'
+       $(NOECHO) $(ABSPERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
+         -e '    if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' --
 
 tardist : $(DISTVNAME).tar$(SUFFIX)
        $(NOECHO) $(NOOP)
@@ -512,21 +567,24 @@ shdist : distdir
 
 
 # --- MakeMaker distdir section:
-distdir : metafile metafile_addtomanifest
+create_distdir :
        $(RM_RF) $(DISTVNAME)
        $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
                -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
 
+distdir : create_distdir distmeta 
+       $(NOECHO) $(NOOP)
 
 
-# --- MakeMaker dist_test section:
 
+# --- MakeMaker dist_test section:
 disttest : distdir
-       cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
+       cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL 
        cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
        cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
 
 
+
 # --- MakeMaker dist_ci section:
 
 ci :
@@ -536,19 +594,41 @@ ci :
          -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
 
 
+# --- MakeMaker distmeta section:
+distmeta : create_distdir metafile
+       $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
+         -e '    or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' --
+
+
+
+# --- MakeMaker distsignature section:
+distsignature : create_distdir
+       $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \
+         -e '    or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' --
+       $(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE
+       cd $(DISTVNAME) && cpansign -s
+
+
+
 # --- MakeMaker install section:
 
-install :: all pure_install doc_install
+install :: pure_install doc_install
+       $(NOECHO) $(NOOP)
 
-install_perl :: all pure_perl_install doc_perl_install
+install_perl :: pure_perl_install doc_perl_install
+       $(NOECHO) $(NOOP)
 
-install_site :: all pure_site_install doc_site_install
+install_site :: pure_site_install doc_site_install
+       $(NOECHO) $(NOOP)
 
-install_vendor :: all pure_vendor_install doc_vendor_install
+install_vendor :: pure_vendor_install doc_vendor_install
+       $(NOECHO) $(NOOP)
 
 pure_install :: pure_$(INSTALLDIRS)_install
+       $(NOECHO) $(NOOP)
 
 doc_install :: doc_$(INSTALLDIRS)_install
+       $(NOECHO) $(NOOP)
 
 pure__install : pure_site_install
        $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
@@ -556,10 +636,8 @@ pure__install : pure_site_install
 doc__install : doc_site_install
        $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
 
-pure_perl_install ::
-       $(NOECHO) $(MOD_INSTALL) \
-               read $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist \
-               write $(DESTINSTALLARCHLIB)/auto/$(FULLEXT)/.packlist \
+pure_perl_install :: all
+       $(NOECHO) umask 022; $(MOD_INSTALL) \
                $(INST_LIB) $(DESTINSTALLPRIVLIB) \
                $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
                $(INST_BIN) $(DESTINSTALLBIN) \
@@ -570,79 +648,59 @@ pure_perl_install ::
                $(SITEARCHEXP)/auto/$(FULLEXT)
 
 
-pure_site_install ::
-       $(NOECHO) $(MOD_INSTALL) \
+pure_site_install :: all
+       $(NOECHO) umask 02; $(MOD_INSTALL) \
                read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \
                write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \
                $(INST_LIB) $(DESTINSTALLSITELIB) \
                $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
                $(INST_BIN) $(DESTINSTALLSITEBIN) \
-               $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+               $(INST_SCRIPT) $(DESTINSTALLSITESCRIPT) \
                $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
                $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
        $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
                $(PERL_ARCHLIB)/auto/$(FULLEXT)
 
-pure_vendor_install ::
-       $(NOECHO) $(MOD_INSTALL) \
-               read $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist \
-               write $(DESTINSTALLVENDORARCH)/auto/$(FULLEXT)/.packlist \
+pure_vendor_install :: all
+       $(NOECHO) umask 022; $(MOD_INSTALL) \
                $(INST_LIB) $(DESTINSTALLVENDORLIB) \
                $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
                $(INST_BIN) $(DESTINSTALLVENDORBIN) \
-               $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+               $(INST_SCRIPT) $(DESTINSTALLVENDORSCRIPT) \
                $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
                $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
 
-doc_perl_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
-       -$(NOECHO) $(DOC_INSTALL) \
-               "Module" "$(NAME)" \
-               "installed into" "$(INSTALLPRIVLIB)" \
-               LINKTYPE "$(LINKTYPE)" \
-               VERSION "$(VERSION)" \
-               EXE_FILES "$(EXE_FILES)" \
-               >> $(DESTINSTALLARCHLIB)/perllocal.pod
+doc_perl_install :: all
 
-doc_site_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
-       -$(NOECHO) $(DOC_INSTALL) \
+doc_site_install :: all
+       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod
+       -$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH)
+       -$(NOECHO) umask 02; $(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLSITELIB)" \
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> $(DESTINSTALLARCHLIB)/perllocal.pod
+               >> $(DESTINSTALLSITEARCH)/perllocal.pod
 
-doc_vendor_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
-       -$(NOECHO) $(DOC_INSTALL) \
-               "Module" "$(NAME)" \
-               "installed into" "$(INSTALLVENDORLIB)" \
-               LINKTYPE "$(LINKTYPE)" \
-               VERSION "$(VERSION)" \
-               EXE_FILES "$(EXE_FILES)" \
-               >> $(DESTINSTALLARCHLIB)/perllocal.pod
+doc_vendor_install :: all
 
 
 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+       $(NOECHO) $(NOOP)
 
 uninstall_from_perldirs ::
-       $(NOECHO) $(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist
 
 uninstall_from_sitedirs ::
        $(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist
 
 uninstall_from_vendordirs ::
-       $(NOECHO) $(UNINSTALL) $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist
+
 
 
 # --- MakeMaker force section:
 # Phony target to force checking subdirectories.
-FORCE:
+FORCE :
        $(NOECHO) $(NOOP)
 
 
@@ -650,19 +708,18 @@ FORCE:
 
 
 # --- MakeMaker makefile section:
-
 # We take a very conservative approach here, but it's worth it.
 # We move Makefile to Makefile.old here to avoid gnu make looping.
 $(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
        $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
        $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
-       $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
-       $(NOECHO) $(MV)   $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
-       -$(MAKE) -f $(MAKEFILE_OLD) clean $(DEV_NULL) || $(NOOP)
+       -$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+       -$(NOECHO) $(MV)   $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+       - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
        $(PERLRUN) Makefile.PL 
        $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
-       $(NOECHO) $(ECHO) "==> Please rerun the make command.  <=="
-       false
+       $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command.  <=="
+       $(FALSE)
 
 
 
@@ -670,12 +727,12 @@ $(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
 
 # --- MakeMaker makeaperl section ---
 MAP_TARGET    = perl
-FULLPERL      = /usr/local/bin/perl
+FULLPERL      = /usr/bin/perl
 
 $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
-       $(MAKE) -f $(MAKE_APERL_FILE) $@
+       $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
 
-$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
        $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
        $(NOECHO) $(PERLRUNINST) \
                Makefile.PL DIR= \
@@ -693,7 +750,11 @@ TESTDB_SW = -d
 
 testdb :: testdb_$(LINKTYPE)
 
-test :: $(TEST_TYPE)
+test :: $(TEST_TYPE) subdirs-test
+
+subdirs-test ::
+       $(NOECHO) $(NOOP)
+
 
 test_dynamic :: pure_all
        PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)
@@ -709,16 +770,14 @@ testdb_static :: testdb_dynamic
 
 # --- MakeMaker ppd section:
 # Creates a PPD (Perl Package Description) for a binary distribution.
-ppd:
-       $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0,02,0,0">' > $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '    <TITLE>$(DISTNAME)</TITLE>' >> $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '    <ABSTRACT>A simple and fast template module</ABSTRACT>' >> $(DISTNAME).ppd
+ppd :
+       $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0.06">' > $(DISTNAME).ppd
+       $(NOECHO) $(ECHO) '    <ABSTRACT>A simple and very fast template module</ABSTRACT>' >> $(DISTNAME).ppd
        $(NOECHO) $(ECHO) '    <AUTHOR>Uri Guttman &lt;uri@sysarch.com&gt;</AUTHOR>' >> $(DISTNAME).ppd
        $(NOECHO) $(ECHO) '    <IMPLEMENTATION>' >> $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '        <DEPENDENCY NAME="File-Slurp" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '        <DEPENDENCY NAME="Test-More" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '        <OS NAME="$(OSNAME)" />' >> $(DISTNAME).ppd
-       $(NOECHO) $(ECHO) '        <ARCHITECTURE NAME="sun4-solaris" />' >> $(DISTNAME).ppd
+       $(NOECHO) $(ECHO) '        <REQUIRE NAME="File::Slurp" />' >> $(DISTNAME).ppd
+       $(NOECHO) $(ECHO) '        <REQUIRE NAME="Test::More" />' >> $(DISTNAME).ppd
+       $(NOECHO) $(ECHO) '        <ARCHITECTURE NAME="i686-linux-gnu-thread-multi-5.10" />' >> $(DISTNAME).ppd
        $(NOECHO) $(ECHO) '        <CODEBASE HREF="" />' >> $(DISTNAME).ppd
        $(NOECHO) $(ECHO) '    </IMPLEMENTATION>' >> $(DISTNAME).ppd
        $(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
@@ -726,12 +785,13 @@ ppd:
 
 # --- MakeMaker pm_to_blib section:
 
-pm_to_blib: $(TO_INST_PM)
-       $(NOECHO) $(PERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', '\''$(PM_FILTER)'\'')'\
-         lib/Template/Simple.pm.expnad blib/lib/Template/Simple.pm.expnad \
-         bug.pl $(INST_LIB)/Template/bug.pl \
-         lib/Template/Simple.pm blib/lib/Template/Simple.pm 
-       $(NOECHO) $(TOUCH) $@
+pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
+       $(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
+         lib/Template/14094525_16586370.gwqa blib/lib/Template/14094525_16586370.gwqa \
+         lib/Template/Simple.pm blib/lib/Template/Simple.pm \
+         lib/14094525_16586370.gwqa blib/lib/14094525_16586370.gwqa 
+       $(NOECHO) $(TOUCH) pm_to_blib
+
 
 # --- MakeMaker selfdocument section:
 
diff --git a/bench.pl b/bench.pl
deleted file mode 100644 (file)
index de2908f..0000000
--- a/bench.pl
+++ /dev/null
@@ -1,342 +0,0 @@
-#!/usr/local/bin/perl
-
-use strict ;
-use warnings ;
-
-use Template::Simple ;
-use Benchmark qw( timethese cmpthese ) ;
-use Data::Dumper ;
-
-my @dims = @ARGV ? (shift, shift) : ( 3, 5 ) ;
-
-my $data = generate_data( @dims ) ;
-#print Dumper $data ;
-
-my $tmpl = Template::Simple->new() ;
-my $comp = Template::Simple->new() ;
-
-my $template = <<TMPL ;
-Header
-Val 1: [%val_1%]
-[%START nest%]
-       Level: [%level%]
-[%END nest%]
-[%START opt%]
-       Optional Level: [%level%]
-[%END opt%]
-Val 2: [%val_2%]
-Footer
-TMPL
-
-$tmpl->add_templates( { bench => $template } ) ;
-my $rendered = $tmpl->render( 'bench', $data ) ;
-
-$comp->add_templates( { bench => $template } ) ;
-$comp->compile( 'bench' ) ;
-my $comp_rendered = $comp->render( 'bench', $data ) ;
-#print $comp->get_source( 'bench' ) ;
-
-my $ok = $$rendered eq $$comp_rendered ;
-print "OK comp [$ok]\n" ;
-
-my $appended = append( $data ) ;
-$ok = $$rendered eq $$appended ;
-print "OK append [$ok]\n" ;
-
-#print $$rendered ;
-#my $joined = joined( $data ) ;
-# print $$rendered ;
-# print "----\n" ;
-# print $$joined ;
-# print $$comp_rendered ;
-
-cmpthese( shift || -2,
-       {
-               render  => sub { my $x = $tmpl->render( 'bench', $data ) },
-#              joined  => sub { my $x = joined( $data ) },
-#              concat  => sub { my $x = concat( $data ) },
-               append  => sub { my $x = append( $data ) },
-#              compiler => sub { my $x = $comp->compile( 'bench' ) },
-               compiled => sub { my $x = $comp->render( 'bench', $data ) },
-       }
-) ;
-
-exit ;
-
-no warnings ;
-
-sub joined {
-
-no warnings ;
-
-       my( $data ) = @_ ;
-
-       my $out = do {
-               my $out ;
-
-               my @data = $data ;
-               while( defined( my $data = shift @data ) ) {
-
-                       if ( ref $data eq 'ARRAY' ) {
-                               push @data, @{$data} ;
-                               next ;
-                       }
-
-                       $out .= ref $data ne 'HASH' ? $data :
-
-                       join( '',
-                       "Header\nVal 1: "
-                       ,
-                       $data->{val_1}
-                       ,
-                       "\n"
-                       ,
-                       do {
-                               my $data = $data->{nest} ;
-                               my $out ;
-
-                               my @data = $data ;
-                               while( defined( my $data = shift @data ) ) {
-
-                                       if ( ref $data eq 'ARRAY' ) {
-                                               push @data, @{$data} ;
-                                               next ;
-                                       }
-
-                                       $out .= ref $data ne 'HASH' ? $data :
-                                       join( '',
-                                       "\n\tLevel: "
-                                       ,
-                                       $data->{level}
-                                       ,
-                                       "\n" ) ;
-                               }
-                               $out ;
-                       }
-                       ,
-                       "\n"
-                       ,
-                       do {
-                               my $data = $data->{opt} ;
-                               my $out ;
-
-                               my @data = $data ;
-                               while( defined( my $data = shift @data ) ) {
-
-                                       if ( ref $data eq 'ARRAY' ) {
-                                               push @data, @{$data} ;
-                                               next ;
-                                       }
-
-                                       $out .= ref $data ne 'HASH' ? $data :
-                                       join( '', 
-                                       "\n\tOptional Level: "
-                                       ,
-                                       $data->{level}
-                                       ,
-                                       "\n" ) ;
-                               }
-                               $out ;
-                       }
-                       ,
-                       "\nVal 2: "
-                       ,
-                       $data->{val_2}
-                       ,
-                       "\nFooter\n" ) ;
-               }
-               $out ;
-       } ;
-
-       return \$out ;
-}
-
-
-sub concat {
-
-no warnings ;
-
-       my( $data ) = @_ ;
-
-       my $out = do {
-               my $out ;
-
-               my @data = $data ;
-               while( defined( my $data = shift @data ) ) {
-
-                       if ( ref $data eq 'ARRAY' ) {
-                               push @data, @{$data} ;
-                               next ;
-                       }
-
-                       $out .= ref $data ne 'HASH' ? $data :
-                       "Header\nVal 1: "
-                       .
-                       $data->{val_1}
-                       .
-                       "\n"
-                       .
-                       do {
-                               my $data = $data->{nest} ;
-                               my $out ;
-
-                               my @data = $data ;
-                               while( defined( my $data = shift @data ) ) {
-
-                                       if ( ref $data eq 'ARRAY' ) {
-                                               push @data, @{$data} ;
-                                               next ;
-                                       }
-
-                                       $out .= ref $data ne 'HASH' ? $data :
-                                       "\n\tLevel: "
-                                       .
-                                       $data->{level}
-                                       .
-                                       "\n" ;
-                               }
-                               $out ;
-                       }
-                       .
-                       "\n"
-                       .
-                       do {
-                               my $data = $data->{opt} ;
-                               my $out ;
-
-                               my @data = $data ;
-                               while( defined( my $data = shift @data ) ) {
-
-                                       if ( ref $data eq 'ARRAY' ) {
-                                               push @data, @{$data} ;
-                                               next ;
-                                       }
-
-                                       $out .= ref $data ne 'HASH' ? $data :
-                                       "\n\tOptional Level: "
-                                       .
-                                       $data->{level}
-                                       .
-                                       "\n" ;
-                               }
-                               $out ;
-                       }
-                       .
-                       "\nVal 2: "
-                       .
-                       $data->{val_2}
-                       .
-                       "\nFooter\n" ;
-               }
-
-               $out ;
-       } ;
-
-       return \$out ;
-}
-
-sub append {
-       my( $data ) = @_ ;
-
-       my $out ;
-
-       my @data = $data ;
-       while( defined( my $data = shift @data ) ) {
-
-               if ( ref $data eq 'ARRAY' ) {
-                       push @data, @{$data} ;
-                       next ;
-               }
-
-
-               $out .= ref $data ne 'HASH' ? $data :
-               "Header\nVal 1: "
-               .
-               $data->{val_1}
-               .
-               "\n" ;
-
-               my @data = $data->{nest} ;
-               while( defined( my $data = shift @data ) ) {
-
-                       if ( ref $data eq 'ARRAY' ) {
-                               push @data, @{$data} ;
-                               next ;
-                       }
-
-
-                       $out .= ref $data ne 'HASH' ? $data :
-                       "\n\tLevel: "
-                       .
-                       $data->{level}
-                       .
-                       "\n" ;
-
-               }
-
-               $out .= ref $data ne 'HASH' ? $data :
-               "\n" ;
-
-               my @data = $data->{opt} ;
-               while( defined( my $data = shift @data ) ) {
-
-                       if ( ref $data eq 'ARRAY' ) {
-                               push @data, @{$data} ;
-                               next ;
-                       }
-
-
-                       $out .= ref $data ne 'HASH' ? $data :
-                       "\n\tOptional Level: "
-                       .
-                       $data->{level}
-                       .
-                       "\n" ;
-
-               }
-
-               $out .= ref $data ne 'HASH' ? $data :
-               "\nVal 2: "
-               .
-               $data->{val_2}
-               .
-               "\nFooter\n" ;
-
-       }
-
-       return \$out ;
-}
-
-sub generate_data {
-
-       my( $outer_size, $inner_size ) = @_ ;
-
-       my @outer_data ;
-
-       for my $outer ( 1 .. $outer_size ) {
-
-               my @inner_data ;
-
-               for my $inner ( 1 .. $inner_size ) {
-
-                       push @inner_data, {
-
-                               val_1   => ($outer x 2),
-                               val_2   => ($inner x 3),
-                               nest    => {
-                                       level => "$outer-$inner",
-                               },
-                               $inner % 2 ? () : (
-                       
-                                       opt     => {
-                                               level => "$outer-$inner",
-                                       },
-                               ),
-                       } ;
-               }
-
-               push @outer_data, [@inner_data] ;
-       }
-
-       return \@outer_data ;
-}
diff --git a/bench_all.pl b/bench_all.pl
deleted file mode 100644 (file)
index 42b5560..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env perl
-
-use strict;
-use warnings;
-
-use Template::Teeny;
-use Template::Simple;
-use Template::Teeny::Stash;
-use Template;
-
-my $iter = shift || -2 ;
-
-use Benchmark qw(:hireswallclock cmpthese);
-basic: {
-
-    my $ts = Template::Simple->new() ;
-       $ts->add_templates( { bench => 'hehe [% name %]' } ) ;
-
-    my $tsc = Template::Simple->new() ;
-       $tsc->add_templates( { bench => 'hehe [% name %]' } ) ;
-       $tsc->compile( 'bench' ) ;
-
-    my $tt = Template::Teeny->new({ include_path => ['t/tpl'] });
-    my $stash = Template::Teeny::Stash->new({ name => 'bob' });
-
-    my $t = Template->new({ INCLUDE_PATH => 't/tpl', COMPILE_EXT => '.tc' });
-    my $out;
-    open my $fh, '>/dev/null';
-
-    $tt->process('bench.tpl', $stash, $fh);
-    $t->process('bench.tpl', { name => 'bob' }, $fh);
-
-    sub teeny {
-        $tt->process('bench.tpl', $stash, $fh);
-    }
-    sub plain {
-        $t->process('bench.tpl', { name => 'bob' }, $fh);    
-    }
-
-    sub simple {
-        $ts->render('bench', { name => 'bob' } );    
-    }
-
-    sub ts_compiled {
-        $tsc->render('bench', { name => 'bob' } );    
-    }
-
-    print "Very simple interpolation:\n";
-    cmpthese( $iter, { teeny => \&teeny, template_toolkit => \&plain,
-                       simple => \&simple, ts_compiled => \&ts_compiled }) ;
-}
-
-some_looping_etc: {
-
-my $tmpl = <<TMPL ;
-<html>
-  <head><title>[% title %]</title></head>
-  <body>
-    <ul>
-      [% SECTION post %]
-        <li>
-            <h3>[% title %]</h3>
-            <span>[% date %]</span>
-        </li>
-      [% END %]
-    </ul>
-  </body>
-</html>
-TMPL
-
-    my $ts = Template::Simple->new() ;
-       $ts->add_templates( { bench2 => $tmpl } ) ;
-
-    my $tsc = Template::Simple->new() ;
-       $tsc->add_templates( { bench2 => $tmpl } ) ;
-       $tsc->compile( 'bench2' ) ;
-
-    my $tt = Template::Teeny->new({ include_path => ['t/tpl'] });
-    my $stash = Template::Teeny::Stash->new({ title => q{Bobs Blog} });
-
-    my $post1 = Template::Teeny::Stash->new({ date => 'Today', title => 'hehe' });
-    my $post2 = Template::Teeny::Stash->new({ date => '3 Days ago', title => 'Something new' });
-    $stash->add_section('post', $post1);
-    $stash->add_section('post', $post2);
-
-    my $t = Template->new({ INCLUDE_PATH => 't/tpl', COMPILE_EXT => '.tc' });
-    my $out;
-    open my $fh, '>/dev/null';
-
-    my $tt_vars = { 
-        title => 'Bobs Blog', 
-        posts => [
-            { title => 'hehe', date => 'Today' },
-            { date => '3 Days ago', title => 'Something new' },
-        ],
-    };
-    teeny2();
-    plain2();
-
-    sub teeny2 {
-        $tt->process('bench2-teeny.tpl', $stash, $fh);
-    }
-    sub plain2 {
-        $t->process('bench2-tt.tpl', $tt_vars, $fh);    
-    }
-
-    sub simple2 {
-        $ts->render('bench2', $tt_vars );    
-    }
-
-    sub ts_compiled2 {
-        $tsc->render('bench2', $tt_vars );    
-    }
-
-    print "\nLoop and interpolation:\n";
-    cmpthese( $iter, { teeny => \&teeny2, template_toolkit => \&plain2,
-                       simple => \&simple2, ts_compiled => \&ts_compiled2 }) ;
-
-}
-
-
-
-
diff --git a/comp.pl b/comp.pl
deleted file mode 100644 (file)
index c1281c0..0000000
--- a/comp.pl
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/local/bin/perl
-
-use strict ;
-use warnings ;
-
-use Template::Simple ;
-
-my $tmpl = Template::Simple->new() ;
-
-$tmpl->add_templates( { ddd => <<DDD } ) ;
-text1
-[%START nest%]
-       BAR is [%bar%]
-[%END nest%]
-DDD
-
-my %data = (
-       ddd     => [
-               {
-                       nest    => {
-                               bar => 'xxx',
-                       },
-               },
-               {
-                       nest    => {
-                               bar => 'yyy',
-                       },
-               },
-               {
-                       nest    => {
-                               bar => 'zzz',
-                       },
-               },
-       ],
-) ;
-
-$tmpl->compile('foo') ;
-#$tmpl->compile('fooz') ;
-
-#my $rendered = $tmpl->render('foo', { foo => 2, bar => 'xxx' } ) ;
-
-#print "REND [$$rendered]\n" ;
-
-$tmpl->compile('ddd') ;
-my $rendered = $tmpl->render( 'ddd', $data{ddd} ) ;
-
-print "REND [$$rendered]\n" ;
-
-print $tmpl->get_source( 'ddd' ) ;
-
-exit ;
old mode 100755 (executable)
new mode 100644 (file)
similarity index 75%
rename from extras/bench_new.pl
rename to extras/bench_all.pl
index 24bd979..642b40b
@@ -24,6 +24,7 @@ my $template_info = [
                simple  => 'hehe [% name %]',
                toolkit => 'hehe [% name %]',
                teeny   => 'hehe [% name %]',
+               tiny    => 'hehe [% name %]',
        },
        {
                name    => 'nested',
@@ -76,18 +77,30 @@ SIMPLE
 <html>
   <head><title>[% title %]</title></head>
   <body>
-    <ul>
-      [% FOREACH post = posts %]
+    <ul>[% FOREACH post = posts %]
         <li>
             <h3>[% post.title %]</h3>
             <span>[% post.date %]</span>
-        </li>
-      [% END %]
+        </li>[% END %]
     </ul>
   </body>
 </html>
 TOOLKIT
 
+               tiny    => <<TINY,
+<html>
+  <head><title>[% title %]</title></head>
+  <body>
+    <ul>[% FOREACH post IN posts %]
+        <li>
+            <h3>[% post.title %]</h3>
+            <span>[% post.date %]</span>
+        </li>[% END %]
+    </ul>
+  </body>
+</html>
+TINY
+
                teeny   => <<TEENY,
 <html>
   <head><title>[% title %]</title></head>
@@ -176,8 +189,9 @@ my $benches = [
                        my $name = $info->{name} ;
 
                        my $results ;
-                       open my $fh, '>', \$results or
-                               die "can't open string for output" ;
+#                      open my $fh, '>', \$results or
+#                      open my $fh, '>', '/dev/null' or
+#                              die "can't open string for output" ;
 
                        mkdir 'tpl' ;
                        write_file( "tpl/$name.tpl", $template ) ;
@@ -210,10 +224,7 @@ my $benches = [
 
 #print Dumper $stash ;
                        $bench->{render} =
-                               sub {
-                                     $obj->process("$name.tpl", $stash, $fh );
-                                     $bench->{result} = $results ;
-                               }
+                               sub { $obj->process("$name.tpl", $stash ); }
 
                },
                verify  => sub {
@@ -221,6 +232,53 @@ my $benches = [
                        $bench->{result} = $bench->{render}->() ;
                },
        },
+       {
+               name    => 'toolkit',
+               template_key => 'toolkit',
+               load    => sub { return eval { require Template } ; },
+               setup   => sub {
+                       my( $bench, $info ) = @_ ;
+
+                       my $template = $info->{$bench->{template_key}} ;
+                       my $data = $info->{data} ;
+
+                       my $obj = Template->new() ;
+
+                       $bench->{render} = sub {
+                               my $output ;
+                               $obj->process(\$template, $data, \$output );
+                               return $output ;
+                       },
+
+               },
+               verify  => sub {
+                       my( $bench, $info ) = @_ ;
+                       $bench->{result} = $bench->{render}->() ;
+               },
+       },
+       {
+               name    => 'tiny',
+               template_key => 'tiny',
+               load    => sub { return eval { require Template::Tiny } ; },
+               setup   => sub {
+                       my( $bench, $info ) = @_ ;
+
+                       my $template = $info->{$bench->{template_key}} ;
+                       my $data = $info->{data} ;
+
+                       my $obj = Template::Tiny->new() ;
+
+                       $bench->{render} = sub {
+                               my $output ;
+                               $obj->process( \$template, $data, \$output );
+                               return $output ;
+                       },
+               },
+               verify  => sub {
+                       my( $bench, $info ) = @_ ;
+                       $bench->{result} = $bench->{render}->() ;
+               },
+       },
 ] ;
 
 run_benchmarks() ;
@@ -304,14 +362,11 @@ load_menus.pl [--verify | -v] [--iterations | -i <iter>]
 
 =head1 DESCRIPTION
 
-       --rid | -r <rids>               Select the restaurant ID to be fetched.
-                                       Can be a comma separated list of rids. 
-                                       'ALL' will select all the valid
-                                       ID's from a source. This is
-                                       required (unless <source> is set
-                                       to 'ALL'.
-
-       [--file | -f]                   Load the XML from files. The file is
+       --verify | -v                   Verify rendered output is correct
+       --iterations | -i <iter>        Iteration count passed to cmpthese
+                                       Default is -2 (seconds of cpu time)
+       --templaters | -t <templaters>  Comma separated list of templaters
+                                       to run in this benchmark
 
        [--help | ?]                    Print this help text
 
diff --git a/extras/cookbook.pl b/extras/cookbook.pl
new file mode 100644 (file)
index 0000000..f48b7b5
--- /dev/null
@@ -0,0 +1,424 @@
+#!/usr/bin/perl
+
+use strict ;
+use warnings ;
+use lib '../lib' ;
+
+use File::Slurp ;
+
+=head1 Template::Simple Cookbook
+
+This cookbook contains examples of idioms and best practices when
+using the Template::Simple module. It will illustrate all the the
+features of this module and show various combinations of code to get
+the job done. Send any requests for more examples to
+E<lt>template@stemsystems.comE<gt>. Read the source code to see the
+working examples or you can run this script to see all the
+output. Each example has its title printed and rendered templates are
+printed with a KEY: prefix and delimited with [].
+
+By combining these techniques you can create and built complex
+template applications that can do almost any task other templaters can
+do. You will be able to share more code logic and templates as they
+are totally isolated and independent from each other.
+
+=head2 Use Scalar References
+
+When passing text either as templates or in data tree elements, it is
+generally faster to use scalar references than plain scalars. T::S can
+accept text either way so you choose the style you like best. Most of
+the examples here will use scalar references. Note that passing a
+scalar reference to the new() constructor as the template will force
+that to be a template and not a template name so no lookup will
+occur. T::S always treats all text values as read only and never
+modifies incoming data.
+
+=cut
+
+use Template::Simple ;
+my $ts = Template::Simple->new() ;
+my $template ;
+
+
+=head1 Token Expansion
+
+The simplest use of templates is replacing single tokens with
+values. This is vry similar to interpolation of scalar variables in a
+double quoted string. The difference is that the template text can
+come from outside the program whereas double quoted strings must be in
+the code (eval STRING doesn't count).
+
+To replace tokens all you need is a template with token markups
+(e.g. C<[% foo %]>) and a hash with those tokens as keys and the
+values with which to replace them. Remember the top level template is
+treated as an unnamed chunk so you can pass a hash reference to
+render.
+
+=cut
+
+print "\n******************\nToken Expansion\n******************\n\n" ;
+
+$template = <<TMPL ;
+This [% token %] will be replaced as will [%foo%] and [% bar %]
+TMPL
+
+my $token_expansion = $ts->render( $template,
+       {
+       token   => 'markup',
+       foo     => 'this',
+       bar     => 'so will this',
+       }
+) ;
+
+print "TOKEN EXPANSION: [${$token_expansion}]\n" ;
+
+=head1 Token Deletion
+
+Sometimes you want to delete a token and not replace it with text. All
+you need to do is use the null string for its data. Altenatively if
+you are rendering a chunk with a hash (see below for more examples)
+you can just not have any data for the token and it will also be
+deleted. Both styles are shown in this example.
+
+=cut
+
+print "\n******************\nToken Deletion\n******************\n\n" ;
+
+$template = <<TMPL ;
+This [% token %]will be deleted as will [%foo%]
+TMPL
+
+my $token_deletion = $ts->render( $template,
+       {
+       token   => '',
+       }
+) ;
+
+print "TOKEN DELETION: [${$token_deletion}]\n" ;
+
+
+=head1 Named Templates
+
+You can pass a template directly to the C<render> method or pass in
+its name. A named template will be searched for in the object cache
+and then in the C<template_paths> directories. Templates can be loaded
+into the cache with in the new() call or added later with the
+C<add_templates> method.
+
+=cut
+
+print "\n******************\nNamed Templates\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+       templates       => {
+               foo     => <<FOO,
+We have some foo text here with [% data %]
+FOO
+       }
+) ;
+
+my $foo_template = $ts->render( 'foo', { data => 'lots of foo' } ) ;
+
+$ts->add_templates( { bar => <<BAR } ) ;
+We have some bar text here with [% data %]
+BAR
+
+my $bar_template = $ts->render( 'bar', { data => 'some bar' } ) ;
+
+print "FOO TEMPLATE: [${$foo_template}]\n" ;
+print "BAR TEMPLATE: [${$bar_template}]\n" ;
+
+=head1 Include Expansion
+
+You can build up templates by including other templates. This allows a
+template to be reused and shared by other templates. What makes this
+even better, is that by passing different data to the included
+templates in different renderings, you can get different results. If
+the logic was embedded in the template you can't change the rendering
+as easily. You include a template by using the C<[%include name%]>
+markup. The name is used to locate a template by name and its text
+replaces the markup. This example shows a single include in the top
+level template.
+
+=cut
+
+print "\n******************\nInclude Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+       templates       => {
+               top     => <<TOP,
+This top level template includes this <<[% include other %]>>text
+TOP
+               other   => <<OTHER,
+This is the included text
+OTHER
+} ) ;
+
+my $include_template = $ts->render( 'top', {} ) ;
+
+print "INCLUDE TEMPLATE: [${$include_template}]\n" ;
+
+=head1 Template Paths
+
+You can search for templates in files with the C<search_dirs> option
+to the constructor. If a named template is not found in the object
+cache it will be searched for in the directories listed in the
+C<search_dirs> option. If it is found there, it will be loaded into
+the object cache so future uses of it by name will be faster. The
+default value of C<search_dirs> option is C<templates>. Templates must
+have a suffix of C<.tmpl>. This example makes a directory called
+'templates' and a template file named C<foo.tmpl>. The second example
+makes a directory called C<cookbook> and puts a template in there and
+sets. Note that the option value must be an array reference.
+
+=cut
+
+print "\n******************\nSearch Dirs\n******************\n\n" ;
+
+my $tmpl_dir = 'templates' ;
+mkdir $tmpl_dir ;
+write_file( "$tmpl_dir/foo.tmpl", <<FOO ) ;
+This template was loaded from the dir [%dir%]
+FOO
+
+$ts = Template::Simple->new() ;
+my $foo_file_template = $ts->render( 'foo', { dir => 'templates' } ) ;
+
+print "FOO FILE TEMPLATE: [${$foo_file_template}]\n" ;
+
+unlink "$tmpl_dir/foo.tmpl" ;
+rmdir $tmpl_dir ;
+
+######
+
+my $cook_dir = 'cookbook' ;
+mkdir $cook_dir ;
+write_file( "$cook_dir/bar.tmpl", <<BAR ) ;
+This template was loaded from the $cook_dir [%dir%]
+BAR
+
+$ts = Template::Simple->new( search_dirs => [$cook_dir] ) ;
+my $bar_file_template = $ts->render( 'bar', { dir => 'directory' } ) ;
+
+print "BAR FILE TEMPLATE: [${$bar_file_template}]\n" ;
+
+unlink "$cook_dir/bar.tmpl" ;
+rmdir $cook_dir ;
+
+=head1 Named Chunk Expansion
+
+The core markup in T::S is called a chunk. It is delimited by paired
+C<start> and C<end> markups and the text in between them is the
+chunk. Any chunk can have multiple chunks inside it and they are named
+for the name in the C<start> and C<end> markups. That name is used to
+match the chunk with the data passed to render. This example uses the
+top level template (which is always an unnamed chunk) which contains a
+nested chunk which has a name. The data passed in is a hash reference
+which has a key with the chunk name and its value is another hash
+reference. So the nested chunk match up to the nested hashes.
+
+=cut
+
+print "\n******************\nNested Chunk Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+       templates       => {
+               top     => <<TOP,
+This top level template includes this <<[% include nested %]>> chunk
+TOP
+               nested  => <<NESTED,
+[%START nested %]This included template just has a [% token %] and another [% one %][%END nested %]
+NESTED
+       }
+) ;
+
+my $nested_template = $ts->render( 'top',
+       {
+       nested => {
+               token   => 'nested value',
+               one     => 'value from the data',
+       }
+} ) ;
+
+print "NESTED TEMPLATE: [${$nested_template}]\n" ;
+
+=head2 Boolean Chunk
+
+The simplest template decision is when you want to show some text or
+nothing.  This is done with an empty hash reference or a null string
+value in the data tree. The empty hash reference will cause the text
+to be kept as is with all markups removed (replaced by the null
+string). A null string (or a reference to one) will cause the text
+chunk to be deleted.
+
+=cut
+
+print "\n******************\nBoolean Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START boolean %]This is text to be left or deleted[% END boolean %]
+TMPL
+
+my $boolean_kept = $ts->render( $template, { boolean => {} } ) ;
+my $deleted = $ts->render( $template, { default => \'' } ) ;
+
+print "KEPT: [${$boolean_kept}]\n" ;
+print "DELETED: [${$deleted}]\n" ;
+
+=head2 Default vs. Overwrite Text
+
+The next step up from boolean text is overwriting a default text with
+another when rendering. This is done with an empty hash reference or a
+scalar value for the chunk in the data tree. The empty hash reference
+will cause the default text to be kept as is with all markups removed
+(replaced by the null string). A scalar value (or a scalar reference)
+will cause the complete text chunk to be replaced by that value.
+
+=cut
+
+print "\n******************\nDefault vs. Overwrite Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START default %]This is text to be left or replaced[% END default %]
+TMPL
+
+my $default_kept = $ts->render( $template, { default => {} } ) ;
+my $overwrite = $ts->render( $template, { default => \<<OVER } ) ;
+This text will overwrite the default text
+OVER
+
+print "DEFAULT: [${$default_kept}]\n" ;
+print "OVERWRITE: [${$overwrite}]\n" ;
+
+=head2 Conditional Text
+
+Instead of having the overwrite text in the data tree, it is useful to
+have it in the template itself. This is a conditional where one text
+or the other is rendered. This is done by wrapping each text in its
+own chunk with unique names. The data tree can show either one by
+passing an empty hash reference for that data and a null string for
+the other one. Also you can just not have a value for the text not to
+be rendered and that will also delete it. Both styles are shown here.
+
+=cut
+
+print "\n******************\nConditional Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START yes_text %]This text shown when yes[% END yes_text %]
+[% START no_text %]This text shown when no[% END no_text %]
+TMPL
+
+my $yes_shown = $ts->render( $template, { yes_text => {} } ) ;
+my $no_shown = $ts->render( $template, {
+       yes_text => '',
+       no_text => {}
+} ) ;
+
+print "YES: [${$yes_shown}]\n" ;
+print "NO: [${$no_shown}]\n" ;
+
+=head1 List Chunk Expansion
+
+T::S has no list markup because of the unique way it handles data
+during rendering. When an array reference is matched to a chunk, the
+array is iterated and the chunk is then rendered with each element of
+the array. This list of rendered texts is concatenated and replaces
+the original chunk in the template. The data and the logic that
+creates the data controls when a template chunk is repeated. This
+example shows the top level (unnamed) template being rendered with an
+array of hashes. Each hash renders the chunk one time. Note that the
+different results you get based on the different hashes in the array.
+
+=cut
+
+print "\n******************\nList Chunk Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+       templates => {
+               top_array => <<TOP_ARRAY,
+
+This is the [%count%] chunk.
+[%start maybe%]This line may be shown[%end maybe%]
+This is the end of the chunk line
+TOP_ARRAY
+} ) ;
+
+my $top_array = $ts->render( 'top_array', [
+       {
+               count   => 'first',
+               maybe   => {},
+       },
+       {
+               count   => 'second',
+       },
+       {
+               count   => 'third',
+               maybe   => {},
+       },
+] ) ;
+
+print "TOP_ARRAY: [${$top_array}]\n" ;
+
+
+=head1 Separated List Expansion
+
+A majorly used variation of data lists are list with a separator but
+not one after the last element. This can be done easily with T::S and
+here are two techniques. The first one uses a token for the separator
+in the chunk and passes in a hash with the delimiter string set in all
+but the last element. This requires the code logic to know and set the
+delimiter. The other solution lets the template set the delimiter by
+enclosing it in a chunk of its own and passing an empty hash ref for
+the places to keep it and nothing for the last element. Both examples
+use the same sub to do this work for you and all you need to do is
+pass it the token for the main value and the seperator key and
+optionally its value. You can easily make a variation that puts the
+separator before the element and delete it from the first element.  If
+your chunk has more tokens or nested chunks, this sub could be
+generalized to modify a list of hashes instead of generating one.
+
+=cut
+
+print "\n******************\nSeparated List Expansion\n******************\n\n" ;
+
+
+sub make_separated_data {
+       my( $token, $data, $delim_key, $delim ) = @_ ;
+
+# make the delim set from the template (in a chunk) if not passed in
+# an empty hash ref keeps the chunk text as is.
+
+       $delim ||= {} ;
+
+       my @list = map +{ $token => $_, $delim_key => $delim, }, @{$data} ;
+
+# remove the separator from the last element
+
+       delete $list[-1]{$delim_key} ;
+
+       return \@list ;
+}
+
+my @data = qw( one two three four ) ;
+
+$ts = Template::Simple->new(
+       templates       => {
+               sep_tmpl        => <<SEP_TMPL,
+Number [%count%][%sep%]
+SEP_TMPL
+               sep_data        => <<SEP_DATA,
+Number [%count%][%start sep%],[%end sep%]
+SEP_DATA
+} ) ;
+
+my $sep_tmpl = $ts->render( 'sep_tmpl',
+       make_separated_data( 'count', \@data, 'sep', '--' ) ) ;
+
+my $sep_data = $ts->render( 'sep_data',
+       make_separated_data( 'count', \@data, 'sep', {} ) ) ;
+
+print "SEP_DATA: [${$sep_data}]\n" ;
+print "SEP_DATA: [${$sep_data}]\n" ;
+
+exit ;
diff --git a/s5-blank.zip b/s5-blank.zip
deleted file mode 100644 (file)
index d9c820e..0000000
Binary files a/s5-blank.zip and /dev/null differ
index d61d67c..b730f69 100644 (file)
 use Test::More ;
 use Template::Simple ;
 
+use Data::Dumper ;
+
 sub template_tester {
 
        my( $tests ) = @_ ;
 
 # plan for one expected ok() call per test
 
-       plan( tests => scalar @{$tests} ) ;
+       plan( tests => scalar @{$tests} * 2 ) ;
 
        my( $obj, $tmpl ) ;
 
 # loop over all the tests
 
-       foreach my $test ( @{$tests} ) {
+       foreach my $compiled ( 0, 1 ) {
 
-               if ( $test->{skip} ) {
-                       ok( 1, "SKIPPING $test->{name}" ) ;
-                       next ;
-               }
+               foreach my $test ( @{$tests} ) {
 
-               unless( $obj && $test->{keep_obj} ) {
+                       $test->{name} .= ' - compiled' if $compiled ;
+
+                       if ( $test->{skip} ) {
+                               ok( 1, "SKIPPING $test->{name}" ) ;
+                               next ;
+                       }
+
+                       if ( $test->{compile_skip} && $compiled ) {
+                               ok( 1, "SKIPPING $test->{name}" ) ;
+                               next ;
+                       }
+
+                       unless( $obj && $test->{keep_obj} ) {
 
 # if there is no kept object, we will constuct one
 
-                       $obj = eval {
-                               Template::Simple->new(
-                                       %{ $test->{opts} || {} }
-                               ) ;
-                       } ;
+                               $obj = eval {
+                                       Template::Simple->new(
+                                               %{ $test->{opts} || {} }
+                                       ) ;
+                               } ;
 
 print $@ if $@ ;
 
 # check for expected errors
 # no errors in new() to catch (yet)
 
-               }
+                       }
 
-               $test->{obj} = $obj ;
+                       $test->{obj} = $obj ;
 
 # see if we use the test's template or keep the previous one
 
-               $tmpl = $test->{template} if defined $test->{template} ;
+                       $tmpl = $test->{template} if defined $test->{template} ;
 
+#print "TMPL [$tmpl]\n" ;
 # run any setup sub before this test. this can is used to modify the
 # object for this test (e.g. delete templates from the cache).
 
-               if( my $pretest = $test->{pretest} ) {
+                       if( my $pretest = $test->{pretest} ) {
+                               $pretest->($test) ;
+                       }
 
-                       $pretest->($test) ;
-               }
+#print Dumper $obj if $test->{dump} ;
 
-# get any existing template object
+                       if ( $compiled ) {
 
-# render the template and catch any fatal errors
+                               my $tmpl_name = 'test' ;
+                               $obj->add_templates( {$tmpl_name => $tmpl} ) ;
+                               eval { $obj->compile( $tmpl_name ) } ;
+#print "ERR $@\n" ;
+
+                               next if check_error( $test ) ;
+                       }
 
-               my $rendered = eval {
-                       $obj->render( $tmpl, $test->{data} ) ;
-               } ;
+# get any existing template object
+# render the template and catch any fatal errors
 
-#print "ERR $@\n" if $@;
+                       my $rendered = eval {
+                               $obj->render( $tmpl, $test->{data} ) ;
+                       } ;
 
 # if we had an error and expected it, we pass this test
 
-               if ( $@ ) {
-
-                       if ( $test->{error} && $@ =~ /$test->{error}/ ) {
+                       next if check_error( $test ) ;
 
-                               ok( 1, $test->{name} ) ;
+                       if( my $posttest = $test->{posttest} ) {
+                               $posttest->($test) ;
                        }
-                       else {
 
-                               print "unexpected error: $@\n" ;
-                               ok( 0, $test->{name} ) ;
-                       }
-                       next ;
-               }
 
 # see if the expansion was what we expected
 
-               my $ok = ${$rendered} eq $test->{expected} ;
+                       my $ok = ${$rendered} eq $test->{expected} ;
 
-# dump any bad expansions
+# dump any bad renderings
 
-               print <<ERR unless $ok ;
+                       print <<ERR unless $ok ;
 RENDERED
 [${$rendered}]
 EXPECTED
@@ -95,8 +108,31 @@ ERR
 
 # report success/failure for this test
 
-               ok( $ok, $test->{name} ) ;
+                       ok( $ok, $test->{name} ) ;
+               }
        }
 }
 
+sub check_error {
+
+       my( $test ) = @_ ;
+
+       if ( $@ ) {
+#print "ERR $@\n" ;
+               if ( $test->{error} && $@ =~ /$test->{error}/ ) {
+
+                       ok( 1, $test->{name} ) ;
+               }
+               else {
+
+                       print "unexpected error: $@\n" ;
+                       ok( 0, $test->{name} ) ;
+               }
+
+               return 1 ;
+       }
+
+       return ;
+}
+
 1 ;
index 1579882..b787300 100644 (file)
--- a/t/error.t
+++ b/t/error.t
@@ -4,9 +4,9 @@ use lib qw(t) ;
 use common ;
 
 my $tests = [
-
        {
-               name    => 'unknown data type',
+               name    => 'unknown template data type',
+               compile_skip    => 1,
                opts    => {},
                data    => qr//,
                template => <<TMPL,
@@ -17,24 +17,21 @@ bar
 EXPECT
                error => qr/unknown template data/,
        },
-
        {
                name    => 'missing include',
                skip    => 0,
                data    => {},
-               template => '[%INCLUDE foo%]',
+               template => '[%INCLUDE foox%]',
                error   => qr/can't find/,
        },
-
        {
                name    => 'code data',
+               compile_skip    => 1,
                skip    => 0,
                data    => sub { return '' },
                template => 'bar',
                error   => qr/data callback/,
        },
-
-
 ] ;
 
 template_tester( $tests ) ;
index 4352416..d7ced74 100644 (file)
@@ -26,12 +26,10 @@ BAR
 ) ;
 
 my $tests = [
-
        {
                name    => 'simple include',
                skip    => 0,
                opts    => {
-
                        templates => {
                                'foo'   => 'bar',
                        }
@@ -67,7 +65,6 @@ my $tests = [
                template => '[%INCLUDE foo%] [%INCLUDE bar%] [%INCLUDE quux%]',
                expected => 'foo is here bar is too quux is on the drums',
        },
-
        {
                name    => 'missing include',
                skip    => 0,
@@ -76,12 +73,11 @@ my $tests = [
                pretest => sub { $_[0]{obj}->delete_templates() },
                error   => qr/can't find/,
        },
-
        {
                name    => 'load include files',
                skip    => 0,
                opts    => {
-                       include_paths => [ qw(
+                       search_dirs => [ qw(
                                templates
                                templates/deeper
                                templates/deeper/deepest
@@ -115,13 +111,15 @@ EXPECTED
                name    => 'delete covering file',
                skip    => 0,
                opts    => {
-                       include_paths => [ qw(
+                       search_dirs => [ qw(
                                templates
                                templates/deeper
                                templates/deeper/deepest
                        ) ],
                },
                pretest => sub { unlink 'templates/deeper/BAR.tmpl' },
+               posttest => sub { write_tmpl_files() },
+
                data    => {},
                expected => <<EXPECTED,
 this loads bar <[this should be hidden then revealed]
@@ -154,6 +152,5 @@ sub write_tmpl_files {
 sub remove_tmpl_files {
 
        unlink keys %tmpl_files ;
-       
        rmdir $_ for reverse @tmpl_dirs ;
 }
index f151054..df7feec 100644 (file)
@@ -10,7 +10,7 @@ use Data::Dumper ;
 my $tests = [
 
        {
-               name    => 'nested bug [- -]',
+               name    => 'nested [- -]',
                skip    => 0,
                opts    => {
                        pre_delim  => qr/\[\-/,
@@ -69,7 +69,7 @@ TEMPLATE
 EXPECTED
        },
        {
-               name    => 'nested bug',
+               name    => 'nested',
                skip    => 0,
                data    => {
                        widgets => [
@@ -124,7 +124,7 @@ TEMPLATE
 EXPECTED
        },
        {
-               name    => 'nested bug ,',
+               name    => 'nested ,',
                skip    => 0,
                opts    => {
                },
@@ -156,7 +156,7 @@ TEMPLATE
 EXPECTED
        },
        {
-               name    => 'nested bug short',
+               name    => 'nested short',
                skip    => 0,
                data    => {
                        widgets => [
diff --git a/t/top.t b/t/top.t
index 49d3b72..3ac76d1 100644 (file)
--- a/t/top.t
+++ b/t/top.t
@@ -6,7 +6,7 @@ use common ;
 my $tests = [
 
        {
-               name    => 'top level - scalar data',
+               name    => 'scalar data',
                data    => 'bar',
                template => <<TEMPLATE,
 junk
@@ -14,7 +14,7 @@ TEMPLATE
                expected => 'bar',
        },
        {
-               name    => 'top level - array data',
+               name    => 'array data',
                data    => [
                        "foo\n",
                        "bar\n",
@@ -28,7 +28,7 @@ bar
 EXPECTED
        },
        {
-               name    => 'top level - blessed array data',
+               name    => 'blessed array data',
                data    => bless( [
                        "foo\n",
                        "bar\n",
@@ -42,7 +42,8 @@ bar
 EXPECTED
        },
        {
-               name    => 'top level - code data',
+               name    => 'code data',
+               compile_skip    => 1,
                data    => sub { \uc ${$_[0]} },
                template => <<TEMPLATE,
 junk