Revision history for Text::Template

1.56  2019-07-09
    - Fix typos in Changes

1.55  2019-02-25
    - Improve AppVeyor tests for older Perls (Thanks Roy Ivy)
    - Check for Test::More 0.94 and skip tests if not installed where
      done_testing() is used (Thanks Roy Ivy).
    - Improve workaround for broken Win32 File::Temp taint failure (Thanks Roy Ivy).
    - Skip/todo tests which fail under Devel::Cover (Thanks Roy Ivy)
    - Add checks and skip_all checks for non-core test modules (Thanks Roy Ivy)

1.54  2019-01-13
    - Fix tempfile creation during tests on Win32

1.53  2018-05-02
    - Add support for decoding template files via ENCODING constructor arg
      [github #11]
    - Docs cleanup: replace indirect-object style examples and use class method
      style constructor calls in the POD docs
    - Docs cleanup: remove hard tabs from POD, replace dated, unfair synopsis
      [github #5], convert "THANKS" section to a POD list

1.52  2018-03-19
    - Fix possible 'Subroutine ... redefined' warning (Github #10)

1.51  2018-03-04
    - Add test for nested tags breakage that happened in v1.46
    - Turn off strict+warnings in sections where template code is eval'ed
      [github #9]

1.50  2018-02-10
  *** Revert support for identical start/end delimiters (e.g.: @@foo@@, XXfooXX)
      due to breakage with nested tags (see
      https://github.com/mschout/perl-text-template/issues/8).  Will revisit
      this in a future release.

1.49  2018-02-07
    - Fix failing tests in v1.48 under perl < 5.8.9

1.48  2018-02-07
    - remove COPYING and Artistic files from the dist.  These are replaced by
      the Dist::Zilla generated LICENSE file.
    - use strict/warnings (thanks Mohammad S Anwar)
    - remove $VERSION checks from tests. This makes it easier to run the test
      with Dist::Zilla and avoids maintenance issue of updating the tests for
      each release (Thanks Andrew Ruder).
    - Allow precompiled templates to work with preprocessing [#29928] (Thanks
      Nik LaBelle)
    - Add "strict" option to fill_in().  This adds "use strict" and "use vars
      (...)" to the prepend section, and only the keys of the HASH option are
      allowed in the template.  (Thanks Desmond Daignault, Kivanc Yazan, CJM)
      [55696]
    - Fix templates with inline comments without newline after comment for perl
      < 5.18 [34292]
    - Don't use bareword file handles
    - use three arg form of open()
    - Fix BROKEN behaviour so that it returns the text accumulated so far on
      undef as documented [28974]
    - Source code cleanups
    - Minimum perl version is now 5.8.0
    - Allow start/end delimiters to be identical (e.g.: @@foo@@, XXfooXX)
      (Thanks mirod) [46639]
    - Fix + document the FILENAME parameter to fill_in() (Thanks VDB) [106093]
    - Test suite cleanups:
        + turn on strict/warnings for all tests
        + run tests through perltidy and formatting cleanup
        + remove number prefixes from test names
        + use Test::More instead of generating TAP by hand
        + use three-arg form of open()
        + don't use indirect object syntax
        + don't use bareword file handles
        + use File::Temp to generate temporary files

1.47  2017-02-27
    - Fix longstanding memory leak in _scrubpkg() [#22031]
    - Fix various spelling errors [#86872]

NOTE: Changes for versions prior to 1.47 have been imported from README

1.46  2013-02-11
    - Thanks to Rik Signes, there is a new
      Text::Template->append_text_to_output method, which Text::Template always
      uses whenever it wants to emit output.  You can subclass this to get
      control over the output, for example for postprocessing.
    - A spurious warning is no longer emitted when the TYPE parameter to ->new
      is omitted.

1.45  2008-04-16

1.44  2003-04-29
    - This is a maintenance release.  There are no feature changes.
    - _scrubpkg, which was responsible for eptying out temporary packages after
      the module had done with them, wasn't always working; the result was
      memory leaks in long-running applications. This should be fixed now, and
      there is a test in the test suite for it.
    - Minor changes to the test suite to prevent spurious errors.
    - Minor documentation changes.

1.43  2002-03-25
    - The ->new method now fails immediately and sets $Text::Template::ERROR if
      the file that is named by a filename argument does not exist or cannot be
      opened for some other reason.  Formerly, the constructor would succeed
      and the ->fill_in call would fail.

1.42  2001-11-05
    - This is a maintenance release.  There are no feature changes.
    - Fixed a bug relating to use of UNTAINT under perl 5.005_03 and possibly
      other versions.
    - Taint-related tests are now more comprehensive.

1.41  2001-09-04
    - This is a maintenance release.  There are no feature changes.
    - Tests now work correctly on Windows systems and possibly on other
      non-unix systems.

1.40  2001-08-30
  *** INCOMPATIBLE CHANGE ***
    -  The format of the default error message has changed.  It used to look
       like:

        Program fragment at line 30 delivered error ``Illegal division by zero''

       It now looks like:

        Program fragment delivered error ``Illegal division by zero at catalog.tmpl line 37''

      Note that the default message used to report the line number at which the
      program fragment began; it now reports the line number at which the error
      actually occurred.

  *** INCOMPATIBLE CHANGE ***
    - The format of the default error message has changed. It used to look like:

        Program fragment at line 30 delivered error ``Illegal division by zero''

      It now looks like:

        Program fragment delivered error ``Illegal division by zero at catalog.tmpl line 37''

    - Note that the default message used to report the line number at which the
      program fragment began; it now reports the line number at which the error
      actually occurred.
    - New UNTAINT option tells the module that it is safe to 'eval' code even
      though it has come from a file or filehandle.
    - Code added to prevent memory leaks when filling many templates.  Thanks
      to Itamar Almeida de Carvalho.
    - Bug fix:  $OUT was not correctly initialized when used in conjunction
      with SAFE.
    - You may now use a glob ref when passing a filehandle to the ->new
      function.  Formerly, a glob was required.
    - New subclass:  Text::Template::Preprocess.  Just like Text::Template, but
      you may supply a PREPROCESS option in the constructor or the fill_in
      call; this is a function which receives each code fragment prior to
      evaluation, and which may modify and return the fragment; the modified
      fragment is what is evaluated.
    - Error messages passed to BROKEN subroutines will now report the correct
      line number of the template at which the error occurred:

        Illegal division by zero at template line 37.

    - If the template comes from a file, the filename will be reported as well:

        Illegal division by zero at catalog.tmpl line 37.

    - New UNTAINT option tells the module that it is safe to eval template code
      even if it has come from a file or filehandle, disabling taint checking
      in these cases.
    - Code added to prevent memory leaks when filling many templates. Thanks to
      Itamar Almeida de Carvalho.
    - Bug fix: $OUT was not always correctly initialized when used in
      conjunction with SAFE.
    - You may now use a glob ref when passing a filehandle to the new function.
      Formerly, a glob was required.
    - Error messages passed to BROKEN subroutines will now report the correct
      line number of the template at which the error occurred:

        Illegal division by zero at template line 37.

      If the template comes from a file, the filename will be reported as well:

        Illegal division by zero at catalog.tmpl line 37.

    - New subclass: Text::Template::Preprocess. Just like Text::Template, but
      you may supply a PREPROCESS option in the fill_in call; this is a
      function which receives each code fragment prior to evaluation, and which
      may modify and return the fragment; the modified fragment is what is
      evaluated. 

1.31  2001-02-05
    - Maintenance and bug fix release
    - fill_in_string was failing.  Thanks to Donald L. Greer Jr. for the test case.

1.23  1999-12-21
    - Small bug fix:  DELIMITER and other arguments were being ignored in calls
      to fill_in_file and fill_this_in.  (Thanks to Jonathan Roy for reporting
      this.)

1.22
    - You can now specify that certain Perl statements be prepended to the
      beginning of every program fragment in a template, either per template,
      or for all templates, or for the duration of only one call to fill_in.
      This is useful, for example, if you want to enable `strict' checks in
      your templates but you don't want to manually add `use strict' to the
      front of every program fragment everywhere.

1.20  1999-03-08
    - You can now specify that the program fragment delimiters are strings
      other than { and }.  This has three interesting effects: First, it
      changes the delimiter strings.  Second, it disables the special meaning
      of \, so you have to be really, really sure that the delimiters will not
      appear in your templates.  And third, because of the simplifications
      introduced by the elimination of \ processing, template parsing is 20-25%
      faster.  See the manual section on `Alternative Delimiters'.
    - Fixed bug having to do with undefined values in HASH options.  In
      particular, Text::Template no longer generates a warning if you try to
      give a variable an undefined value.

1.12  1999-02-28
    - I forgot to say that Text::Template ISA Exporter, so the exported
      functions never got exported.  Duhhh!
    - Template TYPEs are now case-insensitive.  The `new' method now diagnoses
      attempts to use an invalid TYPE.
    - More tests for these things.

1.11  1999-02-25
    - Fixed a bug in the way backslashes were processed.  The 1.10 behavior was
      incompatible with the beta versions and was also inconvenient.  (`\n' in
      templates was replaced with `n' before it was given to Perl for
      evaluation.)  The new behavior is also incompatible with the beta
      versions, but it is only a little bit incompatible, and it is probably
      better.
    - Documentation for the new behavior, and tests for the bug.

1.10  1999-02-13
    - New OUTPUT option delivers template results directly to a filehandle
      instead of making them into a string.  Saves space and time. 
    - PACKAGE and HASH now work intelligently with SAFE.
    - Fragments may now output data directly to the template, rather than
      having to arrange to return it as a return value at the end.  This means
      that where you used to have to write this:

            { my $blist = '';
                  foreach $i (@items) {
                    $blist .= qq{  * $i\n};
                  }
                  $blist;
                }

      You can now write this instead, because $OUT is special.

            { foreach $i (@items) {
                    $OUT.= "  * $i\n";
                  }
                }

      (`A spoonful of sugar makes the medicine go down.')
    - Fixed some small bugs.  Worked around a bug in Perl that does the wrong
      thing with $x = <Y> when $x contains a glob.
    - More documentation.  Errors fixed.
    - Lots more tests.  

1.03  1999-02-06
    - Code added to support HASH option to fill_in.  (Incl. `_gensym'
      function.)
    - Documentation for HASH.
    - New test file for HASH.
    - Note about failure of lexical variables to propagate into templates.  Why
      does this surprise people?
    - Bug fix: program fragments are evaluated in an environment with `no
      strict' by default.  Otherwise, you get a lot of `Global symbol "$v"
      requires explicit package name' failures.  Why didn't the test program
      pick this up?  Because the only variable the test program ever used was
      `$a', which is exempt.  Duhhhhh.
    - Fixed the test program.
    - Various minor documentation fixes.

1.00  1999-02-05
    This is a complete rewrite. The new version delivers better functionality
    but is only 2/3 as long, which I think is a good sign. It is supposed to be
    100% backward-compatible with the previous versions. With one cosmetic
    change, it passes the test suite that the previous versions passed. If you
    have compatibility problems, please mail me immediately.

    - At least twice as fast
    - Better support for filling out the same template more than once 
    - Now supports evaluation of program fragments in Safe compartments.
      (Thanks, Jonathan!)
    - Better argument syntax
    - More convenience functions
    - The parser is much better and simpler
    - Once a template is parsed, the parsed version is stored so that
      it needn't be parsed again.
    - BROKEN function behavior is rationalized. You can now pass an
      arbitrary argument to your BROKEN function, or return a value
      from it to the main program.
    - Documentation overhauled.

Previous Versions
    - Maintained by Mark Jason Dominus (MJD)
