File: Changes

package info (click to toggle)
libtemplate-perl 2.14-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 5,496 kB
  • ctags: 667
  • sloc: perl: 15,349; makefile: 62; xml: 7; sh: 5
file content (2924 lines) | stat: -rw-r--r-- 131,671 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
#========================================================================
#
# Changes 
#
# DESCRIPTION
#   Revision history for the Template Toolkit version 2.14, detailing
#   significant changes between versions, most recent first.  Some 
#   way down the file you'll find a section detailing major changes from 
#   version 1.* to 2.* and a list of "Gotchas!" that you might have to 
#   look out for when upgrading between major versions.
#
# AUTHOR
#   Andy Wardley   <abw@wardley.org>
#
# NOTE
#   This file is built from a source template distributed as part of 
#   the docsrc bundle (docsrc/src/Release/Changes) which is available 
#   from http://www.template-toolkit.org/download.html#docsrc.
#   Any changes you make here may be lost!
#
#------------------------------------------------------------------------
# $Id: Changes.tt2,v 1.116 2004/10/04 10:09:31 abw Exp $
#========================================================================

#------------------------------------------------------------------------
# Version 2.14 - 4th October 2004
#------------------------------------------------------------------------

* Applied patch from Harald Joerg to prevent ttree from spewing warnings 
  when copying files.
  http://template-toolkit.org/pipermail/templates/2004-March/005897.html

* Applied a patch from Paul Orrock to fix a couple of missing errors in 
  ttree.
  http://template-toolkit.org/pipermail/templates/2004-September/006605.html

* Commented out line 797 of Template::Directive.pm which serves no 
  purpose and generates a warning.

* Applied a patch from Mark Fowler to add support for Unicode to TT.
  http://template-toolkit.org/pipermail/templates/2004-June/006270.html

* Changed the fourth argument to process() to accept named IO layers for
  binmode, e.g. process($in, $vars, $out, binmode => ':utf8');

* Added full range of command line options to tpage.
  http://template-toolkit.org/pipermail/templates/2004-September/006545.html

* Applied patches from Tosh Cooey, Simon Wilcox and Kenny Gatdula to fix
  XML::Simple to allow direct access to XMLin() and XMLout() methods. See
  http://template-toolkit.org/pipermail/templates/2004-September/006620.html

* Fixed a bug in the 'callers' list maintained by a template component
  which was failing to remove callers from the list after processing.
  http://template-toolkit.org/pipermail/templates/2004-April/006070.html

* Applied a doc patch from Dave Cash documenting caller and callers.
  http://template-toolkit.org/pipermail/templates/2004-March/005960.html


#------------------------------------------------------------------------
# Version 2.13 - 30th January 2004
#------------------------------------------------------------------------

* Applied patch from Dave Cash to add 'caller' and 'callers' to 
  'component', see 
  http://tt2.org/pipermail/templates/2004-January/005581.html

* Applied patch from Dylan William Hardison to ttree which prevents
  dependencies from interfering with files that are copied.  See
  http://tt2.org/pipermail/templates/2003-December/005458.html


#------------------------------------------------------------------------
# Version 2.12a - 13th January 2004               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed the bug in test 25 of t/date.t, hopefully for good this time, 
  thanks to the efforts of Steve Peters.  See:
  http://template-toolkit.org/pipermail/templates/2004-January/005560.html

* Added the FILE_INFO option to Template::Parser.  Enabled by default, 
  this can be set to 0 to prevent the parser from adding file and line
  info to the generated Perl file.  Don't ask me why - Autrijus wanted
  it (which probably means he's up to something twisted again :-).  See:
  http://template-toolkit.org/pipermail/templates/2004-January/005552.html


#------------------------------------------------------------------------
# Version 2.12 - 12th January 2004
#------------------------------------------------------------------------

* Added the module_version() method to Template::Base to report the 
  version number of a module.  Added some tests to t/base.t.

* Added the --template_module option to ttree, to allow the user to 
  specify a template processing module other than the default 'Template'
  to be used.  Also changed various print statements to send all
  verbose output to stdout, whereas previously it was split across stdout
  and stderr.


#------------------------------------------------------------------------
# Version 2.11b - 7th January 2004                ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied patch from Myk Melez to ensure the 'component' variable 
  remains correctly set to the current templates.  See
  http://template-toolkit.org/pipermail/templates/2004-January/005483.html


#------------------------------------------------------------------------
# Version 2.11a - 6th January 2004                ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed bug in t/date.t and corrected version number of 
  Template::Grammar.


#------------------------------------------------------------------------
# Version 2.11 - 6th January 2004           
#------------------------------------------------------------------------

* Bumped version number and updated documentation for release.


#------------------------------------------------------------------------
# Version 2.10b - 2nd December 2003               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Changed the Template::Document process() method to pass itself
  to the context visit() method when it calls it.  Similarly, changed
  the context visit() method to expect it.  This is useful when 
  subclassing the context but shouldn't have any other effect.

* Modified parser to add the file name and line number of the source
  template to generated Perl code.  This provides useful information
  when warnings and errors are generated by Perl at runtime.  Added
  the t/fileline.t script to test it.


#------------------------------------------------------------------------
# Version 2.10a - 9th October 2003                ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied two patches from Axel Gerstmair to fix bugs in Makefile.PL 
  and t/date.t.  See.
  http://tt2.org/pipermail/templates/2003-April/004553.html
  http://tt2.org/pipermail/templates/2003-May/004572.html

* Applied patch from Jim Cromie to t/autoform.t to skip tests on all
  versions of Perl from 5.8.0 onwards.

* Changed $OUTPUT in Template::Directive to be a package variable, 
  allowing it to be re-defined to permit a flushed output hack.
  http://tt2.org/pipermail/templates/2003-October/005136.html

* Applied a patch from Darren to the 'item' hash vmethod to protect
  against accessing private variables (prefixed '.' or '_')
  http://tt2.org/pipermail/templates/2003-June/004761.html

* Applied a patch from Ivan Adzhubey to template/splash/frame.
  http://tt2.org/pipermail/templates/2003-August/004953.html

* Applied a patch from Bryce Harrington to add the absolute and 
  relative options to ttree.  Also applied a patch from Mark Anderson 
  to add the 'template_debug'.  Removed the old debug option which was 
  as good as useless.  
  http://tt2.org/pipermail/templates/2003-October/005110.html
  http://tt2.org/pipermail/templates/2003-October/005126.html

* Applied another patch from Mark to push files named on the command 
  line through the process_file() sub to ensure that various options 
  like accept checking, pemission preserving and copy processing (but 
  not modification time) are applied.
  http://tt2.org/pipermail/templates/2003-October/005132.html

* Applied a variation of yet another ttree patch from Mark to add the 
  'suffix' option for changing the suffix of output files created.
  http://tt2.org/pipermail/templates/2003-October/005121.html

* Applied a variation of a patch from Dylan William Hardison which 
  adds the 'depend' and 'depend_file' options to ttree.
  http://tt2.org/pipermail/templates/2003-July/004783.html
  http://tt2.org/pipermail/templates/2003-October/005147.html


#------------------------------------------------------------------------
# Version 2.10 - 24th July 2003
#------------------------------------------------------------------------

* Merged in Darren's branch to add the define_vmethod() methods to
  Template::Context and Template::Stash.

* Applied patch from Axel Gerstmair for minor fixes to Makefile.PL, 
  t/gd.t and t/date.t.
  http://template-toolkit.org/pipermail/templates/2003-April/004545.html

* Added undefined() method to the Stash which get() calls if a variable
  value is undefined.  Currently just returns '' to implement existing 
  behaviour, but it provides a method hook for subclasses to redefine.

* Fixed a minor bug which prevented the Stash from being subclassable
  by removing references to __PACKAGE__


#------------------------------------------------------------------------
# Version 2.09c - 29th April 2003                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* applied patch from Ivan Kurmanov to XPath plugin to add handling for 
  comments.

* modified grammar to allow 'IN' as an alternate for '=' in FOREACH 
  directives, thus allowing [% FOREACH item IN [ foo, bar, baz ] %]
  http://template-toolkit.org/pipermail/templates/2003-April/004519.html

* changed test for PROCESS option in Template::Service init from 'exists' 
  to 'defined' so that PROCESS set to undef Does The Right Thing.
  http://template-toolkit.org/pipermail/templates/2003-April/004536.html

* changed Template::process() method to accept a hash reference or list
  of output options following any filename.  This can now be used to 
  explicitly set binary mode (or not) for the output of a file.  Also
  changed Template::_output() method to expect a reference to text rather 
  than a duplicated text string (for efficiency) and also the new hash 
  reference of options.  Also changed the redirect and stdout filters
  accordingly.

* disabled the mandatory binmode setting on all files created under 
  MSWin32.  See previous item for details on how binmode can now be 
  set explicitly, or link below for description of problem.
  http://template-toolkit.org/pipermail/templates/2003-April/004499.html

* applied patch from Axel Gerstmair to Makefile.PL to add TT_EXTRAS item.
  http://template-toolkit.org/pipermail/templates/2003-April/004543.html


#------------------------------------------------------------------------
# Version 2.09b - 24th April 2003                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* fixed bug introduced in 2.08e which caused some exception handling to
  fail under Perl 5.6.1 and earlier.
  http://template-toolkit.org/pipermail/templates/2003-April/004502.html

* applied patch from Tatsuhiko Miyagawa to gd.t test to change size test
  from 6500 to 6000.

* applied patch from Axel Gerstmair to the Image plugin.
  http://template-toolkit.org/pipermail/templates/2003-April/004496.html


#------------------------------------------------------------------------
# Version 2.09a - 23rd April 2003                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* added WRAPPER configuration item, documentation and tests.  Also added 
  'wrapper' configuration item to ttree.  See Template::Manual::Config

* applied patch from Axel Gerstmair to fix File::Spec and File::Temp
  versions in Makefile.PL.
  http://template-toolkit.org/pipermail/templates/2003-April/004480.html

#------------------------------------------------------------------------
# Version 2.09 - 23rd April 2003
#------------------------------------------------------------------------

* Bumped version number for release.


#------------------------------------------------------------------------
# Version 2.08e - 18th March 2003                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* changed Template::Provider and Template::Context to propagate nested
  exceptions (e.g. [ file => [ parse => 'blah blah' ] ]) to allow the 
  caller to accurately differentiate between parse errors and missing
  file or other errors.
  http://tt2.org/pipermail/templates/2003-March/004359.html

* applied a patch from Gervase Markham to add set_legend() to the
  various GD::Graph modules that works with a list of arguments.
  http://tt2.org/pipermail/templates/2003-March/004316.html


#------------------------------------------------------------------------
# Version 2.08d - 18th March 2003                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Made Template::Exception DTRT with overloading (mark)

* Applied a patch from Jonas Liljegren to lower the chunking limit of
  the parser regex to prevent a segfault.  See
  http://tt2.org/pipermail/templates/2003-February/004290.html

* Applied Pudge's patch for the XS Stash bug.  See
  http://tt2.org/pipermail/templates/2003-February/004289.html


#------------------------------------------------------------------------
# Version 2.08c - 4th November 2002               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied a patch from Bradley Baetz to work around a bug in Perl when 
  using an overridden die(), as CGI::Carp does, for example.

* Added the Image plugin interfacing to the Image::Size module, based
  on examples posted to the mailing list by Darren and Mark.  See
  http://tt2.org/pipermail/templates/2002-November/003876.html


#------------------------------------------------------------------------
# Version 2.08b - 1st November 2002               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied two patches from Leon to fix bug in constant folding with
  multiple replacements (a missing 'g' on a s///)

* Applied a patch from Tatsuhiko Miyagawa to Template::Constants to 
  replace 'our' perl5.6isms.

* Added the Template::Plugin::Procedural module for creating plugins that
  use subroutines rather than method calls.

* Fixed a html.t test to allow numerical instead of named entities (mark)

* Added the params() method to the CGI plugin.

* Changed File::Temp and File::Basename to be loaded dynamically in 
  Template::Document as and when needed.  Thanks to a patch from 
  Bradley Baetz.

* Added a preload() method to Template::Config to preload in advance 
  all the Template::* modules typically used.  Also added call to 
  preload() from Template module if $ENV{MOD_PERL} is set.

* Applied a patch from Randal Schwartz to fix rowspan attribute in 
  templates/html/cell and templates/html/row


#------------------------------------------------------------------------
# Version 2.08a - 14th August 2002                ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Totally re-implemented the handling of the DEBUG parameter.  Added 
  DEBUG_* constants to Template::Constants which can be used to enable
  different debugging options and messages.

* Added skip_all($reason) to Template::Test and fixed up a whole bunch
  of tests to use it.  Also made other minor fixes to the tests to run
  nicely (or bail politely) under Perl 5.8.0

* Applied patch from Slaven Rezic to Template::Plugin::Data which 
  modifies the locale loading to append various suffixes (e.g. '.UTF-8')
  in the case that the unadorned locale can't be loaded.

* Bumped version number of File::Spec to 0.8 in Makefile.PL PREREQ_PM.
  Previous versions didn't include splitdir().  Thanks to Slaven Rezic
  for reporting the problem.


#------------------------------------------------------------------------
# Version 2.08 - 30th July 2002
#------------------------------------------------------------------------

* Applied two minor patches from Leon to remove 'use warnings' from 2
  test scripts to maintain compatability with 5.005


#------------------------------------------------------------------------
# Version 2.07c - 22nd July 2002                  ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in Date plugin introduced in last version which caused
  it to ignore the 'time' parameter.

* Modified INCLUDE_PATH handling in Template::Provider to accept a 
  reference to a subroutine or object implementing a paths() method
  as an element in the list.  This is then called to return a 
  dynamically generated path.  Documented and tested.

* Changed the implementation of the NAMESPACE calling code to leave
  the namespace prefix intact on the ident list which then gets 
  passed to the handler's ident() method.  Modified the ident()
  method of Template::Namespace::Constants to expect and remove it.
  Constant folding now *doesn't* happen for constants that return
  a reference or undefined value.  These get compiled as regular
  runtime variable lookups.

* Added new list virtual methods: 'unique' to cull multiple identical
  items, 'merge' to merge lists together, 'splice' which acts 
  just like Perl's splice, and 'slice' which returns a slice of the 
  list.  Also modified first and last virtual methods to take an
  argument indicating the number of items to return from the start or
  end of the list.  Added the 'chunk' scalar virtual method to split a
  string into chunks of a particular flushed either left or right.
  (darren, mark, abw)

* Moved documentation for virtual methods into a separate manpage,
  Template::Manual::VMethods

* Modifed Template::Test to allow -- name testname -- comments to 
  be added to tests to give them names, reported by test harness
  (darren)

* Merged functionality of process() and include() methods into 
  process() with optional third $localize flag.  (darren)

* Modified the OUTPUT option to accept a reference to a list (darren)


#------------------------------------------------------------------------
# Version 2.07b - 7th July 2002                   ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Added the CONSTANTS, CONSTANTS_NAMESPACE and NAMESPACE options, the
  Template::Namespace::Constants module, documentation and t/constants.t
  test suite.  This adds support for compile-time constant folding and
  other custom namespace handlers.


#------------------------------------------------------------------------
# Version 2.07a - 5th July 2002                   ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Changed the Perl and XS stashes to automatically promote a scalar
  to a list and apply a list virtual method (if defined) as a last
  ditch attempt.  

* Changed Template::Stash::Context virtual methods to import those
  of Template::Stash.

* Fixed a potential race condition when using compiled templates
  by changing Template::Document::write_perl_file() to write
  to a temporary file and then rename it into place, thus preventing
  two separate processes attempting to write the same file at the
  same time.

* Added the DEBUG and DEBUG_FORMAT options and the corresponding
  DEBUG directive.
 
* Fixed bug introduced to Template::Provider in 2.06g which changed 
  handling of trailing slashes on COMPILE_DIR.

* Fixed a bug in Template::Parser to preserve any post-chomp flags 
  that were otherwise ignored when an entire directive is commented
  out, e.g.

    [%# blah
      # blah 
    -%]

* Applied a patch from Harald Joerg so that ttree considers files 
  with equal mtime to be "not modified".

* Applied a patch from Keith Murphy adding the gmt flag to the Date
  plugin.

* Applied Makefile.PL portability patch from Chris Nandor.

* Minor documentation fixes.


#------------------------------------------------------------------------
# Version 2.07 - 17th April 2002 
#------------------------------------------------------------------------

* Changed example in synopsis of Template::Plugin::XML::Style to one 
  based on that posted to the mailing list by Tony Bowden.

* Fixed a single/double quoting bug in docsrc which prevented [% and %]
  being correctly displayed in the tables of contents in HTML docs. 


#------------------------------------------------------------------------
# Version 2.06g - 15th April 2002                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in ttree which prevented it from passing the recurse option
  onto the Template object due to a name mismatch: recurse/recursion

* Changed Template::Test to accept messages to ok().  Also added is()
  as an alias for match().

* Fixed an oversight/bug in the XS stash where a missing aTHX_ around 
  line 546 caused compilation to fail under Win32.

* Applied a patch to Template::Provider from Alexander Schilling which 
  untaints paths before calling mkpath() to prevent errors under -T.

* Fixed Template::Parser so that the INTERPOLATE option now works with 
  files > 32K, thanks to the efforts of Stephen Adkins.


#------------------------------------------------------------------------
# Version 2.06f - 13th March 2002                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in both the Perl and XS Stash modules which resulted in 
  virtual methods being called on the base stash, e.g. [% size %]
  was treated as [% stash.size %].  The only exception that we allow
  through is 'import' so that we can [% import(another_hash) %]

* Fixed the compilation of the XS Stash on earlier versions of Perl
  (e.g. 5.00503) and other platforms (e.g. Win32) by including the 
  ppport.h file.

* Fixed a warning about undefined values in Template::Plugin::Format 
  raised by t/format.t

* Fixed a warning in t/html.t raised when neither Apache::Util nor 
  HTML::Entities is installed.


#------------------------------------------------------------------------
# Version 2.06e - 12th March 2002                 ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a minor bug in t/tiedhash.t which was trying to use the XS stash
  even if it wasn't enabled.  Thanks to Lyle Brooks for the patch.

* Added the 'match' virtual method for matching a string against a 
  regex and returning a reference to a list of (captured) (backrefs).

* Changed html filter back into a fast and simple static filter.  Added
  html_entity filter which uses Apache::Util or HTML::Entities to do 
  a complete and thorough (but slower) job.  The undocumented 'entity'
  option of the html filter is now removed (but may appear elsewhere).

* Added the size virtual method for scalars to prove a consistent way
  of testing something.size to see if it has some value(s).  For scalars
  it returns 1.

* Modified the 'sort' and 'nsort' list virtual methods to allow a sort
  key passed to represent a method to be called on objects in the list
  as well as the key of a value to be fetched from hash references in 
  the list.  e.g. [% books.sort('author') %] allows 'books' to contain 
  a list of hash refs with an 'author' key or objects with an 'author'
  method.  Thanks to Tony Bowden for suggesting this improvement.

* Applied a patch from Simon Wilcox to strip MS-DOS \r characters from 
  end of lines read by the Datafile plugin.

* Applied a patch from Ville Skytt which fixes numerous minor bugs 
  in various splash templates.

* Added the 'defined' and 'exists' virtual hash methods for testing if
  a value has a defined value, or exists in the hash, respectively.

* Applied a patch from Stathy Touloumis to make the XS Stash thread safe.

* Added the 'grep' virtual list method.

* Applied a patch from Mark Fowler to improve the XML XPath plugin's
  handling of nested elements.

* Fixed handling of prefix support in template() and insert() methods
  of Template::Content.  Any prefix is stripped from the name but passed 
  as the second argument to the provider fetch() method.  e.g.
  [% INCLUDE foo:bar %] calls the foo $provider->fetch('bar', 'foo') and
  [% INCLUDE http://tt2.org/t/templates/hello %] results in a call to
  $provider->fetch('//tt2.org/t/templates/hello', 'http')


#------------------------------------------------------------------------
# Version 2.06d - 22nd January 2002               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied a patch to the DBI plugin from Simon Matthews to stop it 
  from closing a DBH which was passed in open from an external source.

* Applied another patch from Simon to fix a bug with compiled templates
  which were never being loaded due to a '<' comparison of timestamps
  rather than '<='.  See
  http://tt2.org/pipermail/templates/2002-January/002361.html

* Applied a patch from Doug Steinwand which fixes a minor bug in the 
  XS Stash as reported by Andrey Brindeew:
  http://tt2.org/pipermail/templates/2002-January/002475.html

* Changed URL plugin to accept multiple values for CGI parameters, e.g.
  [% USE URL('/cgi-bin/foo', items=[10,20]) %] generates a URL like:
  /cgi-bin/foo?item=10&amp;item=20

* Applied a patch from David D. Kilzer to Makefile.PL to add -I flags
  to the various invocations of perl that we missed, and also to add
  a clean/FILES target for WriteMakefile().  See.
  http://tt2.org/pipermail/templates/2002-January/002431.html

* Fixed Makefile.PL to warn, not die, about mandatory modules, leaving
  it to the definitions in the PREREQ_PM which the CPAN module can 
  understand.  Thanks to Leon for waving the flag.

* Applied Leon's doc patch to the Table plugin to demonstrate 
  row/column transposition.

* Added ucfirst and lcfirst filters to fold first character to upper
  or lower case respectively.  Thanks to Paul Makepeace for the patch.

* Fixed truncate method of String plugin to not append suffix if the 
  string is already shorter than the required length.  Thanks to 
  Yann Kerherv for the patch.


#------------------------------------------------------------------------
# Version 2.06c - 20th December 2001              ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Changed both Perl and XS Stash modules to try to apply a SCALAR_OPS
  virtual method to a blessed object as a last-ditch chance if all else
  fails.  Thanks to Tony Bowden for reporting the problem.  See
  http://tt2.org/pipermail/templates/2001-December/002263.html

* Added tie() method to DBI plugin which interfaces to the Tie::DBI 
  module, based on some plugin code sent to me courtesy of Dave 
  Hodgkinson.  Also made various minor cleanups to DBI code and updated 
  documentation and tests.  Incidentally, this tickled the missing 
  feature in the XS stash which doesn't yet support tied hashes.

* Applied a patch from Christian Schaffner which fixes a problem in 
  the Makefile.PL for installation via the fink package manager under 
  Mac OS X.

* Fixed up some of the ugliness in the docsrc tools.


#------------------------------------------------------------------------
# Version 2.06b - 2nd December 2001               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Added the Template::Plugin::Filter module to make plugin filters 
  easier to write and rewrote the Template::Plugin::XML::Style to use
  it.

* Added the Template::Plugin::String module which provides a nice
  object oriented approach to string manipulation.  

* Added the '_' string concatenation operator.  [% foo = bar _ baz %]

* Applied Craig's suggested fixes to the parser to correct potential
  precendence problems and added tests to the test suite.  See:
  http://tt2.org/pipermail/templates/2001-November/002138.html

* Applied Leon's patch to Template::Service to delete the 'template'
  entry added to the variable hash at the end of processing.

* Fixed an obscured bug/oversight in Template::Plugins which tested
  generated plugin objects for truth rather than definedness to see if
  the plugin returned was valid.  This can cause problems if your 
  object has an overloaded stringification operator which gets called
  (but shouldn't) and could return an untrue (but correct) value.

* Fixed t/dumper.t to only have one entry in each hash to avoid hash 
  ordering problems.  Thanks to Randal for reporting the problem.

* Added the assert() subroutine to Template::Test.

* Added some more content to the FAQ.
  

#------------------------------------------------------------------------
# Version 2.06a - 19th November 2001              ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Added the XML::Style plugin for doing simple XML stylesheet like 
  transformations and t/xmlstyle.t.

* Fixed a bug in the DBI plugin where nested loops could cause the inner
  query to overwrite the _STH of the outer query causing the outer loop
  to end prematurely.  Thanks to Dave Hodgkinson, Craig Barratt and Simon
  Matthews for working on the problem and solution.  For more info, see
  http://tt2.org/pipermail/templates/2001-November/002067.html

* Applied a patch from Aleksey Nogin to Makefile.PL to call bin/gifsplash
  with the '-i' option.  This fixes the problem reported by Kenny Flegal:
  http://www.tt2.org/pipermail/templates/2001-November/002028.html

* Applied a patch from Stas Bekman to add 'align' to template/html/row.
  

#------------------------------------------------------------------------
# Version 2.06 - 7th Nov 2001
#------------------------------------------------------------------------

* Fixed a bug in t/compile5.t which caused the following test warning on 
  Win32: "Cannot chdir to D/blah/blah/Template-Toolkit-2.05c/t/test: No 
  such file or directory at t\compile5.t line 73".  Thanks to Chris 
  Winters for finding the bug and testing the fix.


#------------------------------------------------------------------------
# Version 2.05d - 6th Nov 2001                    ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in the parser which was missing a '^' anchor on the regex
  matching the TAGS directive, causing it to match anywhere.  Thanks to
  Dominic Mitchell and Adrian Howard for reporting and fixing the problem.
  See http://tt2.org/pipermail/templates/2001-October/001760.html

* Modified Template::Parser to correctly handle "\t" and "\r" in double
  quoted strings as well as "\n".  Added test to t/parser.t

* Applied a patch from Stas Bekman to add 'valign' as an option to the 
  html/cell template.

* Applied a patch from Harald Joerg to document the 3rd $default
  option to Template::Stash::set().  

* Fixed a problem in the docsrc build whereby double quote strings
  were causing embedded variables to be incorrectly interpolated, e.g.
  [% INCLUDE xyz title="set($var, $val, $default)" %] is now 
  [% INCLUDE xyz title='set($var, $val,  $default)' %].  Thanks to 
  Harald Joerg for reporting the problem.


#------------------------------------------------------------------------
# Version 2.05c - 22 Oct 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied a patch from Tony Payne which fixes a bug where templates were
  being mangled under mod_perl due to a missing O_TRUNC on a sysopen().
  See http://www.tt2.org/pipermail/templates/2001-October/001834.html

* Fixed the mess I made of Pudge's XS Stash patch applied in 2.05b.

* Updated the INSTALL/README guides to note the PPM installation for
  Win32 users.


#------------------------------------------------------------------------
# Version 2.05b - 21 Sep 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied a patch from Chris Nandor to bring the XS stash in line with
  the regular Perl stash wrt accepting defined but empty keys.  See
  http://www.tt2.org/pipermail/templates/2001-September/001695.html

* Applied a patch to Template::Provider from Craig Barratt to fix 
  a bug when caching is turned off (CACHE_SIZE = 0).  See
  http://www.tt2.org/pipermail/templates/2001-September/001682.html

* Moved installation out of README into a separate INSTALL file and
  added the HACKING document as a pointer to the internals docs.

* Added the 'uri' filter for URI escaping text.


#------------------------------------------------------------------------
# Version 2.05a - 12 Sep 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Applied a patch from Chris Nandor to use 'MSWin32' as a specific O/S
  detection rather than /win/i which gives a false positive for 'Darwin'.
  Needless to say, that's something of an insult to Darwin  :-).  Also 
  fixes Template::Provider to use File::Spec::file_name_is_absolute() to 
  test for absolute paths instead of the previous kludge.

* Updated Template::Manual::Internals to include information about
  how to prepare patches and other useful information for potential
  TT hackers.

* Added some code to the XS Stash to handle trivial access to tied 
  hashes.  Regular set/get/default should work as expected, but at 
  present intermediate hashes are not auto-vivified on assignment,
  e.g. [% these.dont.get.created.in.XS.but.do.in.the.perl.stash = 10 %] 


#------------------------------------------------------------------------
# Version 2.05 - 11 Sep 2001
#------------------------------------------------------------------------

* Bumped version number and updated documentation for release.


#------------------------------------------------------------------------
# Version 2.04f - 10 Sep 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in the Date plugin which was performing one localtime() too 
  many when a date was passed in to the format() method.  e.g. the result 
  from date.format('12:59::00 30/09/2001', '%H:%M') was 13:59 not 12:59.
  Thanks to Thierry-Michel Barral and Matthew Tuck for reporting the
  problem.

* Incorporated Doug's new version of the XS Stash.  It fixes the problem 
  with strings not being recognized as integers (and the item = item + 1 
  problem). It also adds a few additional tests for this situation to 
  t/stash-xs.t

* Fixed a minor bug in Makefile.PL which looked for 'msql' or 'mysql' as
  the default DBD for testing DBI but didn't select a suitable default
  if the above drivers weren't available.


#------------------------------------------------------------------------
# Version 2.04e - 06 Sep 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed bug in 'list' entry in $HASH_OPS in both Template/Stash.pm and 
  Template/Stash/Context.pm to return '%$hash' instead of 'values %$hash'.
  Thanks to Craig Barrett for reporting the problem.

* Applied a patch from Craig to Stash.pm and Stash/Context.pm to 
  accept negative integers as array indices, counting back from the
  end of the list as in Perl.  This brings it into line with the new
  XS Stash.
  http://www.tt2.org/pipermail/templates/2001-August/001493.html
  
* And another patch from Craig to allow $var and ${var} to be used as
  keys in hashes.  
  http://www.tt2.org/pipermail/templates/2001-August/001410.html

* Modified Template::Plugins fetch() method to accept $factory as a
  code reference.  Then changed _load() to return a closure for
  regular Perl modules loaded (via LOAD_PERL option) which, which
  called by fetch(), removes the first argument, the $context
  reference, which the non-plugin module won't be expecting.  This
  fixes the problem reported (and also fixed but in a slightly
  different way) by Lyle Brooks, here in these messages:
  http://www.tt2.org/pipermail/templates/2001-August/001397.html
  http://www.tt2.org/pipermail/templates/2001-August/001406.html

* Removed the eq, ne, gt, lt, ge and ne operators added in 2.04d.  Given
  that they can (and did) break code that had existing variables with 
  those names, I decided it was best to strip them out again and think
  more carefully about adding them to an official release.  Hence they're
  not going to be in 2.05.

* Fixed an outrageous oversight in the HTML 'rgb' template by defining
  'orange' as a valid colour (I can't believe Leon hasn't already sent
  me a patch for this!)  Created a new custom colour scheme in the 
  Makefile.PL which uses it.  Hacked the Makefile.PL and the generated 
  ttree config file to allow text colours to be specified as well as
  button background colours.


#------------------------------------------------------------------------
# Version 2.04d - 29 Aug 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Incorporated Doug Steinwand's XS Stash.  This adds the files in the 
  'xs' directory, t/stash-xs.t, bin/tt-bench.pl and includes some work
  on the Makefile.PL to incorporate the required prompting, etc.

* Added gt, ge, lt and le as comparison operators which map directly 
  to their Perl counterparts.  Added tests to t/stash.t and relevant
  documentation to the IF directive.

* Applied some patches from Leon and Doug to enhance the coverage of
  the test suite.

* Added 'sorted' as a flag to the HTML plugin to return attributes in 
  sorted order.  Mainly for debugging purposes, as used in t/html.t.

* Fixed Template::Parser.pm to recognise "\r" as a valid escape sequence
  in double quoted strings.


#------------------------------------------------------------------------
# Version 2.04c - 04 Aug 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed t/dbi.t and t/latex*.t to not complain about "Test header seen
  twice".  Thanks to Leon.


#------------------------------------------------------------------------
# Version 2.04b - 04 Aug 2001                     ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in the Makefile.PL which prevented the correct targets 
  from being added to the generated Makefile to install additional
  components, build HTML docs, etc. 

* Applied a patch from Chris Nandor to fix a bug introduced by the taint 
  checks in 2.04 which barfed on ';' in filenames.  Also changes open()
  to sysopen() in Template::Document for additional security.  See
  http://www.tt2.org/pipermail/templates/2001-August/001348.html

* Another part of the same pudge patch adds FACTORY as a default value
  to Template::Parser to allow Template::Directive factory class to 
  be replaced.


#------------------------------------------------------------------------
# Version 2.04a - 5th July 2001                   ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Changed GD plugin and tests to require GD version 1.20.  See
  http://www.tt2.org/pipermail/templates/2001-July/001212.html

* Applied Craig's fix for the DBI plugin to correctly destroy a 
  statement handle to ensure that finish() gets called on it even if the
  iterator doesn't complete.  See:
  http://www.tt2.org/pipermail/templates/2001-July/001216.html

* Further to Craig's points in the above post, I added get_all() and 
  get() to the DBI iterator so that you can now do this:

  [% people = DBI.query(...) %]
  [% person = people.get %]   # first person
  [% person = people.get %]   # second person
  [% FOREACH person = people.get_all %]
     # third to nth person(s)
  [% END %]

* Fixed Template::Provider which wasn't saving compiled templates to 
  disk when specified with an absolute path, as reported by Merlyn.  See
  http://www.template-toolkit.org/pipermail/templates/2001-July/001213.html

* Updated Makefile.PL to accept various command line args including 
  TT_ACCEPT to automatically accept all default values and TT_QUIET to
  shut the file up with all those yackety yack, yack messages.


#------------------------------------------------------------------------
# Version 2.04 - 29th June 2001
#------------------------------------------------------------------------

* Applied a patch from Craig Barratt to both the regular
  Template::Stash and the alternate Template::Stash::Context which
  allows array indexes into hashes and arrays (slices) in the same
  manner as Perl.  For example:

    [% keys = [ 'foo', 'bar' ]
       vals = hash.$keys	# [ hash.foo, hash.bar ]

       keys = [ 2, 3, 7 ]
       vals = list.$keys        # [ list.2, list.3, list.7 ]
    %]

* Applied another patch from Craig to Parser.pm which fixes a bug
  relating to text strings being interpolated in a numerical context.
  See: http://www.tt2.org/pipermail/templates/2001-April/000901.html

* Applied yet another patch from Craig ("Man of the Patch" for v2.04 :-),
  to fix a problem with NEXT not working inside switch:

    FOREACH and WHILE now get a LOOP: label, and NEXT and LAST now
    generate "next LOOP;" and "last LOOP;".  However, the original
    code allows naked "NEXT" or "LAST" (which behave like STOP).  I
    didn't want to change this behavior, so NEXT and LAST only get the
    LOOP label inside loops (except in the top-level atomexpr FOREACH
    and atomexpr WHILE cases, which should be ok).

* Does he ever sleep!  :-) Another patch from Craig to improve upon 
  the ref->template mapping feature in Template::View.  Documentation
  pending.  For further details, see
  http://www.tt2.org/pipermail/templates/2001-June/001161.html

* Applied a patch from Mark Fowler, which fixes the problem with 
  search/replace virtual methods incorrectly returning with a search
  pattern of '0'.  e.g. [% bob = '0'; bob.replace('0', 'zero') %] 
  now returns 'zero' instead of ''.

* Applied a patch from Doug Steinwand to prevent the Stash from 
  raising undef error reporting 'Can't locate object methof "bar" via 
  package "Foo"' unless $DEBUG is enabled.

* Applied a patch to the DBI plugin from Rafael Kitover which calls
  the DBI connect_cached() method instead of connect() to allow 
  connection caching in a persistant server environment (e.g. Apache
  mod_perl).

* Changed html filter to be a dynamic filter factory, allowing the 
  'entity' option to be set to prevent entities of the form 
  '&word;' being converted to '&amp;word;'

    [% FILTER html(entity = 1) %]
       < &amp; >		    # &lt; &amp; &gt;
    [% END %]

* Changed Template::Stash to propogate any object errors that 
  are references (e.g. Template::Exception objects or otherwise)
  or string that don't look like "Can't locate object method ...".

* Fixed various typos in docsrc/xml/ttdocsrc with a deft:
  s/Plugin::GD::Graphs/Plugin::GD::Graph/g;

* Applied a patch from Leon Brocard to remove a suspect test from
  t/filter.t which Chris Nandor reported as causing problems.

* Added Craig's comments on replace backreferences and TT grammar to
  TODO list.

* Applied various patches from Leon: to remove redundant "print 1..0"
  in various t/*.t files; to add '1;' to end of '.defaults.cfg' file;
  and to fix t/vmeth.t and t/leak.t to run correctly under latest
  bleadperl. 

* Applied a patch from Jonas Liljegren to fix problems with errors 
  being raised in -T taint mode.

* Fixed another problem identified by Jonas so that filters are no 
  longer cached.  See:
  http://www.tt2.org/pipermail/templates/2001-June/001192.html


#------------------------------------------------------------------------
# Version 2.03 - 15th June 2001
#------------------------------------------------------------------------

* Added new virtual methods 'item', 'list', 'hash' to each of scalar, 
  list and hash ops to Do The Right Thing to convert the original value
  to what the caller wants.  This is based on a patch supplied by Craig
  Barratt...

* ...which implements a number of new features to the stash, most
  notably the ability to specify the context in which you want an
  object method or subroutine to be called in by appending '.list' or
  '.scalar' to a dotted variable.  e.g. [% cgi.param('foo').scalar %].
  I haven't folded this patch into the core Stash yet (other than
  adopting the virtual methods described above) but it's provided as
  an alternate stash implementation, Template::Stash::Context, which
  you can create and specify to your Template object via the STASH
  configuration option.  I'd like to a) benchmark it and b) give
  people the option of trying it out (and hacking on it?) before
  integrating the new features into the default stash.

* Applied a patch to add the Latex filter and GD plugin functionality,
  thanks to the excellent work of Craig Barratt and Richard Tietjen.  
  In Craig's words:

    Here is a new version of my Latex filter and GD plugin code.
    (This adds a latex filter that supports PDF, PS and DVI output,
    plus 16 or so plugins for the GD::* modules, allowing PNG, GIF
    output.)

    [Includes] Richard Tietjen's changes for the latex filter for WinXX
    [which] didn't make it into the May 20th version.  The new version
    includes the correct changes for WinXX and also now has been
    tested against TexLive and MikTeX on WinXX.

  Craig's patch also included full documentation so you can read all about
  it in the Manual and Module pages.  In addition, the Makefile.PL now 
  searches for GD modules and external Latex programs and does some extra
  user prompting for confirmation of Latex installation/configuration.
  Not only that, but Craig also managed to roll in a couple of other 
  minor bug fixes and documention updates.  Nice work!

* Fixed the parser to accept fully dotted up variable assignments in 
  argument lists, e.g. in INCLUDE, etc.  You can now do this:

  [% INCLUDE html/head
      html.head.title = 'My Title'
  %]

  Note however that the assignment to such variables is always "global",
  even though INCLUDE claims to localise the stash.  Remember that the
  localisation does not perform a deep copy so the localised copy of 
  the 'html' variable might just be a copy of the reference to a previously
  defined hash array.  Thus, you modify the original albeit via a copy
  of the reference to it.  See INCLUDE section of 
  Template::Manual::Directives for further details.

* Added 'base' option to Template::View.  This allows one view to inherit
  from another "base class" view.  If a template isn't defined in a
  derived view then it automatically asks its base view for it, and so
  on up the inheritance tree.

    [% VIEW myview.default
            prefix = 'view/default/';
       END 
    %]
    [% VIEW myview.fancy
            base   = myview.default
            prefix = 'view/fancy/';
       END
    %]

  In this example, [% myview.fancy.header %] will be resolved as
  [% INCLUDE view/fancy/header %] or [% INCLUDE view/default/header %]
  if 'view/fancy/header' doesn't exist.  Variables are also inherited.

* Added the 'sealed' and 'silent' parameters to VIEW to allow view to be
  optionally unsealed (allow external variable updates/creation) and
  to silence warnings about attempts to update sealed variables, 
  respectively.  See the Template::Manual::Views page for more info on
  this and previosu item.

* Added the HTML plugin for generating (very basic) HTML elements.
  See the Template::Plugin::HTML documentation.

* Added the present() and content() methods to XML::DOM::Node in the 
  XML::DOM plugin to make them work harmoniously with VIEWs.  See the 
  Template::Plugin::XML::DOM documentation for further details.

* Did the same for Template::Plugin::XML::XPath, adding present($view)
  and content($view) methods to XML::XPath::Node::Element and a
  present($view) method to XML::XPath::Node::Text.  See the
  Template::Plugin::XML::DOM documentation for more details.

* Added the calc() method to the Date plugin to return an interface to
  the Date::Calc module.  e.g.     

    [% USE Date; calc = Date.calc %]
    [% calc.Monday_of_Week(22, 2001).join('/') %]

* Moved Template::Tutorial to Template::Tutorial::Web and added the 
  tutorial kindly donated by Dave Cross on generating and using data
  files with TT as Template::Tutorial::Datafile.  Template::Tutorial
  is now an index to the tutorials.

* Changed the bin/tt2inst script to no longer use the 'no_chdir' option
  of the File::Find module which isn't supported in earlier version such
  as distributed with pre-5.6.0 Perl.  Thanks to a patch from Vivek
  Khera <khera@kcilink.com>.  Changed Makefile.PL to accept File::Spec
  version 0.6 or later.

* Fixed a bug in the FOREACH directive which would barf with the error
  "undef error - loop is undefined" when DEBUG was enabled.

* Applied a patch from Eric Cholet to fix a bug in META data items not
  correctly escaping ' and \ characters.

* Applied another patch from Eric to fix "Use of uninitialised value"
  warning when using a subclassed parser.

* Applied a patch to ttree from Leon Brocard print full path for ignored 
  files.

* Fixed typo in the ttree help page which incorrectly listed debug
  mode as '-d' (now '-dbg' as well as '--debug')

* Fixed (hopefully once and for all!) the problem with choming the 
  final newline in a template.  The last newline is now chomped just 
  like any other, depending on the POST_CHOMP flag and/or trailing '-'
  in the directive.  e.g. 

    [% FILTER latex('ps') %]
       ...
    [% END -%]

  If you explicitly want a newline then make sure one is added to the 
  end of the template and don't enable POST_CHOMP or add a trailing '+'
  in the directive, e.g.

    [% INCLUDE footer +%]

* Made a number of fixes to the HTML generated by the Splash! and HTML
  libraries to make it conformant with HTML 3.2 specificiation.  Added
  DOCTYPE to html/header, ALT tags, ... added html/head, html/body and 
  html/html to do more thorough job using nested variables.  Also added
  html/config to load HTML plugin.  Full conformance is still an issue,
  but we're working on it...


#------------------------------------------------------------------------
# Version 2.02 - 6th April 2001
#------------------------------------------------------------------------

* Updated various components of the Splash! library, cleaned up some
  ugliness (a little) and revised the examples.  Documentation in
  Template::Library::Splash is now hopelessly out of date but examples
  are more comprehensive.  Makefile.PL now prompts user to select a 
  colour scheme for creating the documentation and examples.

* Fixed problems with Splash! images displaying the "wrong" colour on
  certain systems.  It appears to be the case that this was automatic
  gamma correction at work, an otherwise very cool feature of PNG
  files.  Alas it broke things here so we've switched to GIF files.
  Also made an improvement to the way of generating and using the
  images.  By using simple transparency and doing away with the
  anti-aliasing it's possible to support any foreground colour for a
  set of images in a background colour.  One set of black images are
  now distributed with TT.  These are blown into many colours during 
  installation, implemented by the bin/gifsplash script and defined
  as the 'tt2_splash' Makefile target, run automatically as part of
  'make install'.

* Changed redirect filter factory and the underlying Template::_output
  method to accept a 'binmode' flag.  The bin/gifsplash script sets
  this flag to ensure that the GIFs generated for Splash! are valid on
  Win32 platforms (it's a good job SAM knows what binmode is for... :-)

* Applied a patch from Leon Brocard to add 'recurse' and 'verbose'
  options to the ttree.cfg files generated by Makefile.PL.  Their
  absence was preventing the docs and examples from being built
  (unless, like the stupid author, you already had a default
  ~/.ttreerc which included these flags :-).

* Fixed Makefile.PL to check for File::Spec 0.82, thanks to the efforts
  of Doug Steinwand and Leon who found and fixed the problem with 
  'splitdir' otherwise not being available.  Later changed requirement
  from 0.82 to 0.80 because this is the version currently distributed
  with ActivePerl 5.6.0 and it appears to work just fine (saves those
  poor Win32 users from having to install any more modules than 
  absolutely necessary)

* Removed test for platform specific error messages from t/xpath.t
  Removed warning from README that this test would fail.  Thanks 
  again to Leon for the patch and to <umun@yahoo.com> (no name
  given) for reporting the problem.

* Applied another patch from Leon to fix Template::Base.pm to avoid
  "Use of uninitialized value..." warnings.

* Applied yet more patches from Leon to add "use Template::Plugin" or
  something similar to the File, Directory and View plugins.  'use
  base' doesn't work as advertised (e.g. in ensuring the module is
  loaded) in older versions of Perl.

* Fixed t/leak.t to only run one particular test if Perl version is 
  5.6.0 or greater.  Test fails on earlier versions due to destructors
  being called in a different order.

* Updated Makefile.PL to supply a more typical default installation
  directory for Win32 systems - C:/Program File/Template Toolkit 2/.
  This brought to light numerous bugs (following) which were fixed
  with the invaluable help of Simon Matthews and Theakston's Black
  Sheep Ale... :-)

* Pathnames generated in the Makefile.PL for the Makefile are now all
  "double quoted" to protect embedded whitespace, e.g. when building
  docs: ttree -f "C:/Program Files/...")

* Patched Template/Provider.pm in several places to strip out any
  extra ':' characters put in the wrong place of a path.  For example,
  when writing compiled template "C:/foo" to disk with a COMPILE_DIR 
  of "C:/bar", the resulting file is now "C:/bar/C/foo" instead of
  the erroneous "C:/bar/C:/foo".

* On Win32 systems, provider prefixes must be more than 1 character in
  length.  This is a compromise for cases where you might want to do
  something like: [% INCLUDE C:/foo/bar %].  Remains unchanged on 
  other platforms.

* On Win32 systems the DELIMITER now defaults to a slight variation of
  ':' if not otherwise set.  It now uses /:(?!\/)/ to split on ':'
  where not followed by '/'.  This makes things like INCLUDE_PATH =>
  'C:/here:C:/there' work properly, although setting a more suitable
  DELIMITER for Win32 systems (e.g. ';') is still recommended (we tried
  automatically setting it to ';' on Win32, but that caused more problems
  than it was worth).

* Changed Template::Provider to consider a file starting (\w:)?/ as an
  ABSOLUTE path when running on Win32 (e.g. C:/foo).  On other
  platforms, it remains unchanged, looking only for a leading '/'.
  Also changed ttree to do the same, so that 'ttree -f C:/test.cfg'
  is treated as an absolute path and it doesn't try and prefix it
  with the ttree configuration file directory.  Note that ttree
  does this regardless of OS.

* Fixed stringification problem identified by SAM.  Objects that have
  auto-stringification sometimes didn't get properly stringified at the
  right time.  e.g. [% a = "$an_obj" %].

* Fixed File and Directory plugins to gracefully ignore Perl dying with
  "getpwuid() not supported on this platform" errors on Win32.  The
  'uid' and 'user' attributes of File and Directory plugin objects 
  are left undefined.

* Then, hacked t/file.t and t/directry.t test to not be run under
  Win32.  There are a couple of outstanding minor problems with these
  test scripts caused by differences in '/' and '\' as path
  separators.  Need to fix these at some point.

* Makefile.PL now saves configuration options in '.defaults.cfg' 
  file, using these values as defaults when run again.

* Removed duplicated $VERSION from DBI and XML::DOM plugins, thanks
  to Jonathan Leffler.

* Updated documentation to reflect new changes.


#------------------------------------------------------------------------
# Version 2.01 - 30th March 2001
#------------------------------------------------------------------------

* Added the various template libraries in the 'templates' directory.
  The 'html' library implements some generally useful HTML elements.
  The 'pod/html' libraray contains some templates for converting POD to
  HTML, used in building the TT2 HTML documentation, for example.  The
  'ps' library contains templates defining a few useful marks and other 
  procedures for generating PostScript pages.  The 'splash' directory
  contains templates for the "Splash!" library which implements a 
  widget set for building stylish HTML user interfaces.  

* Added a host of example pages in the 'examples' directory which 
  demonstrate use of the above libraries.

* Added an 'images' directory to contain the small images used to build
  up the Splash! interface components.

* Added the 'docs' directory containing templates and library elements
  for building the TT2 documentation as HTML pages.

* Updated Makefile.PL to now offer to install optional libraries,
  images, build HTML docs, examples, etc.  Adds 'tt2_install',
  'tt2_html_docs' and 'tt2_examples' as Makefile targets if requested.
  These then get run as part of "make install".

* Totally re-organised the documentation, splitting the long user manual
  into separate Template::Manual::* pages, adding the Template::FAQ, 
  Template::Internals, and various other changes.  All POD and HTML
  documentation is built from the same sources in the form of another
  set of templates, POD files, XML files, scripts, etc., distributed 
  separately as the 'docsrc' bundle, and available from the web site.
  The POD documentation now gets glued onto the end of the .pm
  modules and only creates separate .pod files for those manual pages
  that don't have equivalent modules (e.g. Template::FAQ, etc.)
  NOTE: this might mean that existing .pod files from earlier versions
  of TT might mask documentation in newer .pm files... 

* Added the Template::View module, the VIEW directive and the View
  plugin which can be used collectively to create dynamic views.  This
  is a very powerful tool which fulfills a number of requirements and
  makes possible a number of things that have previously been messy,
  difficult or not possible.  Views are primarily collections of
  templates.  You can define BLOCKs within a view and they remain
  local to it, but can be called from outside the view.  This is still
  very experimental.  Things are likely to change.  See
  Template::Views for (incomplete) documentation and take a look at
  t/view.t for examples.

    [% VIEW fancy_html
	    prefix = 'splash/'		# template prefix/suffix
	    suffix = '.tt2'		
	    bgcol  = '#ffffff'		# and any other variables you 
	    style  = 'Fancy HTML'       # care to define as view metadata,
	    items  = [ foo, bar.baz ]	# including complex data and
	    foo    = bar ? baz : x.y.z  # expressions
    %]

	[% BLOCK header %]		# define "private" view blocks
	   Title: [% title %]
	[% END %]

    [% END %]				# end of VIEW definition

    [% v = fancy_html %]		# view is a regular object ref, re-
    [% mycode(v) %]			# assign it, pass it around, etc.

    [% v.title %]			# access view metadata

    [% v.header(title = 'Foo!') %]	# view "methods" process blocks or
    [% v.footer %]			# templates with prefix/suffix added
					# => [% INCLUDE splash/footer.tt2 %]

* Added the facility to specify multiple templates within a PROCESS,
  INCLUDE, INSERT or WRAPPER directive.  For all but WRAPPER, the 
  templates are processed in the order specified.

    [% PROCESS config + header + menu %]
    [% INCLUDE section/break + html/titlebar
         title='A New Section'
    %]
    [% WRAPPER edge + box + titlebar %]
       ...
    [% END %]

  Multiple WRAPPER templates get processed in reverse order to create 
  the correct nesting effect.  In the example above, the enclosed block
  is processed and passed to 'titlebar' which wraps it and passes the 
  output to 'header' which wraps it and passes the output to 'box', which 
  wraps it and passes the output to 'edge' which wraps it and returns the
  output.  Thus the specification order is outermost to innermost, but 
  they are actually processed from the inside out.

* Templates specified to INCLUDE, PROCESS, WRAPPER and INSERT can now
  be given a prefix (delimited by ':', as in "file:blahblah.txt" or 
  "http://www.tt2.org/index.html", for example) which maps them to a
  particular template provider or providers.  A PREFIX_MAP
  configuration option can be specified as a hash array mapping prefix
  names to a reference to a list of providers.  For convenience, you 
  can also specify the argument as a string of integers, delimited by
  any non-numerical sequence, to indicate indices into the LOAD_TEMPLATES
  provider list.  e.g.

    my $template = Template->new({
	LOAD_TEMPLATES => [ $foo, $bar, $baz, $wiz ],
	PREFIX_MAP => {
	    src => '0, 2',	# $foo and $baz
	    lib => '1, 2',	# $bar and $baz
	    all => '0, 1, 2',	# $foo, $bar and $baz
	}
    });

  Thus [% INCLUDE src:hello.tt2 %] indicates the 'hello.tt2' template
  to be provided by $foo or $baz, [% INCLUDE lib:hello.tt2 %] is mapped
  to $bar and $baz, [% INCLUDE all:hello.tt2 %] can be provided by 
  $foo, $bar or $baz, and the default [% INCLUDE hello.tt2 %] is
  mapped to the entire LOAD_TEMPLATES list: $foo, $bar, $baz and $wiz.
  This is initially useful for things like ttree which would like a way
  to differentiate between templates in one place and templates in 
  another.  It can also be used, of course, to provider special providers
  for certain file type, as in http://fetch.some.file.com/blah/blah/...

* Fixed the parser to accept expressions on the right hand side of 
  parameter definitions for INCLUDE, etc.  e.g.

    [% INCLUDE header
         title = my_title or your_title or default_title
         bgcol = (style == 'dark' ? '#000000' : '#ffffff')
    %]

* Added the PLUGIN_FACTORY configuration option to Template::Plugins
  to allow class names or object prototypes to be specified for plugins.
  No module loading is attempted, unlike the existing PLUGINS which 
  assumes entries are module names which it tries to load.  This may
  change in a future release (ideally by integration with PLUGINS) so
  it remains undocumented for now.

    package My::Plugin;
    ...

    package main;

    my $tt = Template->new({
	PLUGIN_FACTORY => {
	    plugin1 => 'My::Plugin',         # class name
	    plugin2 =>  My::Plugin->new(),   # prototype obj
	},
    });

* Added the File and Directory plugins which blossomed from the
  Directory plugin written by Michael Stevens and posted to the
  mailing list.  These give you access to files and directories on
  your filesystem and also allow you to create representations of
  abstract files/dirs.

  WARNING: recognise that this gives the author of any templates you
  run access to information about your filesystem.  We assume that the
  author of your templates is you or someone you trust to have access
  to that kind of information.  If you're running "untrusted"
  templates (we assume you know what you're doing) then you'll very
  probably want to disable these plugins.  Alas there is no easy way
  to disable plugins at the moment other than deleting them or writing
  null or error throwing plugins to mask them.  Making this easier is
  a TODO.

* Added the Pod plugin which uses the Pod::POM module to parse a Pod
  file or text string and build an object model.  You can then walk 
  it and present it in different ways using templates.  Great for 
  building HTML documentation from Pod and unsurprisingly used to 
  build the new TT2 docs.

* Applied a patch from Chris Nandor to add a new feature to the
  PRE_CHOMP and POST_CHOMP options.  When set to 1, they continue to
  act as before.  When set to 2, all whitespace is collapsed into a
  single space.  CHOMP_NONE, CHOMP_ALL and CHOMP_COLLAPSE are 
  defined in Template::Constants and can be imported as the :chomp
  tagset, for those who want them.

* Applied a patch from Doug Steinwand to fix a problem in
  Template::Provider which would server stale templates if the
  modification time of the files went backwards.  In addition, it now
  uses the $Template::Provider::STAT_TTL (time to live) variable
  (default: 1) to determine how often to stat the files to check for
  changes.  TT2 now supports time running backwards!  :-)

* Applied a patch from Vivek Khera which fixes a memory leak in the 
  MACRO directive, prevalent when using TT under mod_perl.  Also added 
  t/leak.t to test that memory is properly freed and circular references
  broken by the delocalisation of the stash.  All seems to work as expected
  including plugins that contain context references, MACRO definitions, 
  and so on (but note that this is the test suite run from the command
  line, and doesn't explicitly test under mod_perl...)

* Applied a patch from Axel Gerstmair to fix a bug in PERL blocks
  and filters which caused references to the context and stash to be
  kept in global package variables.  This meant they stayed alive for
  far too long.  Added a couple of tests to t/leak.t to check this now 
  works OK.

* Fixed a bug in the parser triggered by [% CATCH DEFAULT %].  Thanks
  to Vivek Khera for reporting the problem.  This also fixes a problem
  reported by Thierry-Michel Barral which was causing bare 'CATCH'
  blocks to not catch errors and instead pollute STDERR.

* Fixed another bug in the parser preventing double quoted META attributes
  from containing single quotes, e.g. [% META title="C'est un test" %].
  Thanks to Philippe Bruhat for reporting the problem.

* Added the 'indent' filter to indent a block by prefixing each line with
  a specified string, or a number of spaces when the argument is numerical.

* Added the 'trim' filter to remove leading/trailing whitespace and 
  'collapse' filter to additionally collapse multiple whitespace characters
  to a single space.

* Added escapes for ' (&apos;) and " (&quot;) to the html filter, thanks 
  to Lyle Brooks and Vivek Khera.  Then, having done that, I removed
  the &apos; escape because my browser didn't recognise &apos; as a 
  valid entity.  What's going on here?  Need to check the HTML spec...

* Added tag style 'star' of the form [* ... *]

* Changed the Template::Stash get() and set() methods to accept a 
  compound variables as a single parameter and automatically convert
  it to an array.  Note that it doesn't correctly handle arguments
  to dotted elements (e.g. foo(10).bar(20), but does mean that you can 
  now write $stash->get('foo.bar.baz') instead of the more laborious
  $stash->get(['foo', 0, 'bar', 0, 'baz', 0]).

* Fixed a bug in Template::Stash which was raising an error when an 
  element on the left hand side of a '.' evaluated to a defined, but 
  empty value.

* Fixed an obscure bug in Template::Stash which occurred when calling 
  a scalar method on a value which contained a valid and visible object 
  package name.  e.g. [% name = 'Foo::Bar'; name.baz() %] called
  Foo::Bar->baz().

* Fixed a bug in the Template::Stash 'replace' virtual method which 
  returned the original string when the replace string was specified 
  empty.   [% var = 'foo99'; var.replace('foo', '') %] now correctly 
  returns '99' instead of the original string 'foo99'.  Thanks to 
  Tryggve Johannesson and Jeremy Wadsack for reporting the problem.

* Added magical handling of the 'import' variable to stash clone() and
  update methods.  This implements the V1 functionality whereby you can
  write [% INCLUDE foo import=myhash %].  Note that 'import' is lower case,
  (V1 was upper case IMPORT) as in V2 it is in keeping with the virtual 
  hash method (e.g. same as myhash.import(another.hash)).  Thanks to 
  Brian Cooper for raising the issue.

* Yet another change to Template::Stash.  Objects which are blessed 
  arrays will now honour virtual array methods if the object doesn't
  otherwise implement a particular method.  For example, you can now
  write [% USE Datafile(...) %] and then [% Datafile.size %].  The 
  '.size' now works as virtual method on the blessed ARRAY which 
  consitutes the Datafile object.  Thanks to Keith Murphy for 
  identifying the problem.

* Fixed another obscure bug, this time in Template::Parser which wasn't 
  chomping the final newline in the input string.  Thanks to Paul 
  Makepeace for reporting the problem.

* Finally identified the cause of an error occasionally being reported
  by Template::Service when is thrown a non-reference exception.  It
  appears to be a problem interacting with CGI::Carp.  For now, it's
  fixed and tolerated in Template::Service (but could possibly do with
  a better long term solution?).  Thanks to Jo Walsh, Trond Michelson,
  and I'm sure several others who reported this and helped to track
  the problem down (and also fixing the confess() bug I introduced
  when I added the tracer code.  D'Oh!)

* Removed some old "delegate-to-another-object" code from Template::Plugin,
  including a nasty AUTOLOAD method which prevented derived objects from 
  acting as transparent hashes.  If delegative functionality is required 
  then it should be implemented as Template::Plugin::Delegate (and may
  well be in the fullness of time).

* Fixed a whole bunch of typos and spellos thanks to patches from Leon,
  Paul Sharpe and Robert McArthur.

  
#------------------------------------------------------------------------
# Version 2.00  1st December 2000
#------------------------------------------------------------------------

* Added the repeat(n), search(pattern) and replace(search, replace)
  virtual methods for scalars, and fixed a warning in the split()
  method raised when an attempt was made to split an undefined value.

* Changed the THROW directive to accept multiple parameters which 
  become named items of the 'error.info' item, thanks to a suggestion
  from Piers Cawley.  Positional arguments can be addressed as 
  [% error.info.n %] or as a list as [% error.info.args %].  Named 
  parameters can be accessed as [% error.info.name %].
  e.g. 
    [% TRY %]
    [% THROW foo 'one' 2 three=3.14 %],
    [% CATCH %]
       [% error.type %]        # foo
       [% error.info.0 %]      # one
       [% error.info.1 %]      # 2
       [% error.info.three %]  # 3.14
    [% END %]

* Moved the definition of Template::TieString from Template::Directive
  into Template::Config (for now) to ensure that its definition is 
  visible even if the Template::Parser, and through it, the
  Template::Directive module, haven't been loaded.  This fixes the 
  bug causing the error "Can't locate object method "TIEHANDLE" 
  via package Template::String..." raised when using EVAL_PERL with 
  compiled templates only.  In this case, the parser wasn't getting
  loaded (because it had no templates to parse, them all being pre-
  compiled) and the Template::TieString defintion wasn't visible to 
  the EVAL_PERL blocks that require it.  Added a test to t/compile3.t.
  Thanks to Igor Vylusko for reporting the problem.

* Changed the Template::Directive Perl generator for EVAL_PERL blocks
  to generate code to first test the EVAL_PERL option in the runtime
  context and throw a 'perl error - EVAL_PERL not set' exception if
  unset.  Thus the behaviour for EVAL_PERL when using compiled templates 
  is now: if the EVAL_PERL option isn't set in the _compiling_ context, 
  then Perl code will be generated which *always* throws an exception
  'perl error - EVAL_PERL not set'.  If EVAL_PERL is set, then it will
  generate code which tests the EVAL_PERL option in the _running_ 
  context (which may not be the same context that compiled it), and 
  throws the same error is the option is not set.  Note that [% RAWPERL %]
  blocks are added verbatim to the generated code if the EVAL_PERL
  option is set in the compiling context and no runtime check for 
  EVAL_PERL is made.  Similarly, [% PERL %] blocks could contain a
  Perl BEGIN block, e.g. "BEGIN { # subterfuge code here }" which 
  will always get executed at runtime, regardless of any runtime 
  EVAL_PERL option.  Thanks to Randal Schwartz for raising this issue.

* Fixed an obscure bug in WRAPPER which was causing some variables to 
  have apparently strange values when within the block content.  This
  was due to the content being formed into a closure which was called
  from within the WRAPPER template, possibly after some variable values
  had been changed.  e.g.
    [% title = "foo" %]
    [% WRAPPER outer title="bar" %]
       The title is [% title %]
    [% END %]
  Here, the 'outer' template should be called with a 'title' value of 
  'bar' but with 'content' set to 'The title is foo'.  Previously, 
  the content would have been processed from within the 'outer' template,
  resulting in a 'content' value of 'The title is bar'.  The behaviour is
  now correct.

* Filter failures are now raised as 'filter' exception types, instead
  of 'undef'.

* Applied a patch from Simon Matthews to fix some minor bugs in the 
  DBI plugin:

  - Added _connect method to Plugin::DBI for backwards compatability with 
    code from version 1 of Template that subclassed the plugin

  - Changed the new mothod on the DBI plugin so that it checks to see if 
    it is being called by a subclassed object.  

  - Fixed the return value in the DBI plugin when connect is called more 
    than once in the lifetime of the plugin

* Removed a dubious looking chomp() from Template::Plugins which may
  have caused abject stringification of any error object throw by a 
  failed plugin constructor.  Thanks to Piers Cawley for finding the 
  devious culprit.

* Changed ttree to not offer to create a ~/.ttreerc file if it doesn't
  exist when the user has specified a '-f file' on the command line.
  Thanks to Michael Stevens for raising the issue.

* Added the match($result, $expect) subroutine to Template::Test.

* Modified the final test of wrap.t to strip any trailing whitespace from
  the output due to a problem with Text::Wrap under 5.005_02.  Thanks to
  Rob Stone for reporting the problem.

* Added documentation for DEBUG options and stderr filter.  Thanks to
  Piers Cawley for spotting the omission.


#------------------------------------------------------------------------
# Version 2.00-rc2  14th November 2000
#------------------------------------------------------------------------

* Added the 'prev' and 'next' methods to Template::Iterator and 
  Template::Plugin::DBI::Iterator to return the previous and next 
  items from the data set.

* Added the 'sort' and 'nsort' virtual methods for hash arrays, 
  thanks to a patch provided by Leon Brocard.

* Various fixes to DBI plugin, configuration and test:- modified
  Makefile.PL to prompt for DBI DSN specific to user's DBD; changed
  DBI plugin to accept DBI attributes (e.g. ChopBlanks) as named
  parameters to connect method; fixed t/dbi.t to not munge 'user'
  variable in final test; added 'ChopBlanks' attributes to satisfy
  tests under certain DBD's (e.g.  Pg).  Thanks to Jonas Liljegren and
  Chris Nandor for their efforts in finding, testing and fixing the
  problems.

* Modified the XML::DOM plugin to work with XML::DOM version 1.27
  which now uses blessed array references instead of hashes as the 
  underlying data types.  Changed Makefile.PL and t/dom.t to require
  version 1.27 or later.

* Changed the Template::Iterator module to *NOT* automatically expand
  the contents of blessed ARRAY objects to construct the iteration data
  set.  The previous behaviour caused problems with modules such as 
  XML::DOM where a single object passed to the iterator constructor
  would be expanded into a list of the member data, rather than being
  treated as a single item list containing that one object.  A blessed
  ARRAY reference can now provide the as_list() method which the
  iterator constructor will call to return list data.

* Fixed a bug in Template::Provider to ensure that template metadata 
  (e.g. name, modtime, etc.) is written to compiled template files.
  Thanks to Steven Hetland for reporting the problem.

* Changed the Template::Directive::template() generator method to 
  raise an error if a context reference isn't passed to a template 
  subroutine as the first argument.

* Fixed t/autoformat.t to use locale dependant numerical formatting.
  Note that versions of Perl prior to 5.6.0 still have problems and 
  will cause t/autoform.t tests 23 and 25 to fail under locales that 
  use a decimal separator other than '.'.  The Makefile.PL will issue
  a warning in such cases.  Thanks to Jonas Liljegren for reporting 
  the problem.

* Applied a patch from Leon Brocard which corrects the behaviour of 
  the URL plugin to join parameters with '&amp;' instead of '&'.

* Fixed a bug in the AUTOLOAD method of the Template::Plugin base 
  class which caused warnings about not finding _DELEGATE pseudo-hash
  method under Perl 5.6.0.

* Various minor documentation fixes, thanks to Henrik Edlund and Leon
  Brocard.


#------------------------------------------------------------------------
# Version 2.00-rc1  1st November 2000
#------------------------------------------------------------------------

* Added the push(), pop(), unshift() and shift() virtual list methods
  and fixed the parser to allow empty lists to be created (also fixed
  the parser to prevent warnings being raised by empty hashes).
  Updated test scripts and documentation to include examples.  Thanks
  to Stas Beckman for raising the issue.

* Incorporated the DBI plugin module, written by Simon Matthews.  This 
  features a major reorganisation of the code, fixes a few bugs, removes
  some lava flow, and has improved documentation and test script.

* Updated the Makefile.PL to prompt for DBI test parameters, check for
  external modules (and in particular, versions which may cause problems)
  and various other niceties.  Also updated the README and TODO files.

* Rewrote the XML::DOM plugin, fixing the memory leakage problems and 
  adding the toTemplate() method and friends, as provided by Simon 
  Matthews.  Note that it's quite easy to send Perl into a deep
  recursive loop via the childrenToTemplate() and allChildrenToTemplate()
  methods due to a misfeature added by abw.  This will be fixed in a 
  future release and may result in behavioural changes to the
  *children* methods,  so don't rely on them too heavily for now.

* Incorporated the Dumper plugin from Simon Matthews which interfaces to
  the Data::Dumper module.

* Fixed a bug in the Datafile plugin which was causing the last data field 
  to be ignored.  Credit due (yet again!) to Simon Matthews for finding 
  the missing chomp().

* Fixed a bug in Template::Directive which was generating a 'Useless use 
  of scalar ref constructor in void context...' for empty BLOCK 
  definitions.

* Added the Wrap and Autoformat plugins which interface to Text::Wrap
  and Text::Autoformat respectively.  Thanks to Robert McArthur for the 
  original Autoformat plugin code.

* Added the XML::XPath plugin, test script and documentation.

* Fixed a bug in the Template::Service module which was using any 
  non-word characters to delimit lists of PRE/POST_PROCESS files.
  A value such as 'config, header.html' would be interpreted as 
  [ 'config', 'header', 'html' ].  It now uses the DELIMITER value
  which is ':' by default, e.g. PRE_PROCESS => 'config:header.html'
  is interpreted as [ 'config', 'header.html' ].

* Fixed a bug in the parser grammar which was failing to correctly 
  identify compound variables that contained two or more consecutive
  numbers.  For example, the variable [% pi.3.14 %] was being interpreted 
  as 'pi' . '3.14', instead of 'pi' . '3' . '14'.

* Further modified parser to accept single quoted BLOCK names that would
  otherwise choke on 'illegal' characters.  e.g. [% BLOCK 'foo bar' %]

* Changed the Template::Context::template() method to always throw an
  exception when a template can't be found instead of simply setting
  an internal error string.  Modified other Template::Context and
  Template::Service methods to expect this behaviour and act
  accordingly.  The visible impact of this is that the Template
  error() method will now always return an exception object.
  Previously there were certain cases where a plain error string would
  have been returned.

* Change the ROOT_OPS, SCALAR_OPS, HASH_OPS and LIST_OPS virtual
  method tables in Template::Stash to incorporate any existing defined
  values.  Previously, you had to 'use Template::Stash' before
  defining any new virtual methods to prevent them being overwritten
  when Template::Stash was subsequently loaded.  Thanks to Chris
  Nandor for identifying the problem and suggesting a fix.

* Changed BREAK directive to LAST to keep it in line with Perl (don't
  know why I originally chose 'BREAK' - must have had my C head on at
  the time).  BREAK is still supported as an alias for LAST.

* Renamed the Template::Iterator number() method to count(), although
  number() is still supported for backwards compatability.  The DBI 
  plugin used count() instead of number() (an oversight, I think) but I 
  decided that count() was the better name (shorter and more obvious).
  Also changed internal Template::Iterator counter variables to UPPER
  CASE to allow AUTOLOAD to be more easily reused by derived iterators
  such as the one for the DBI plugin.

* The Template::Plugin module is now derived from Template::Base.  The
  only significant ramification of this is that plugins should now
  call the error() method on failure in preference to fail().  The
  fail() method is still supported and delegates on to error(), but it
  raises a deprecation warning.

* Fixed a bug in the Table plugin which caused an "undefined variable..."
  warning to be emitted when an empty list was provided.

* Renamed 'evalperl' filter to 'perl', something that previously
  couldn't be done (before ANYCASE) due to 'perl' clashing with 'PERL'
  reserved word.  'evalperl' is still provided for backwards
  compatability.  Also added 'evaltt' as an alias for the 'eval'
  filter and 'file' as an alias for 'redirect' (which I claimed to 
  have done back in beta 3 but obviously hadn't). 

* Fixed a bug in the perl/evalperl filter which was causing a stash
  reference to be bound in a closure that could later become
  invalidated.  This could lead to variables not getting/setting their
  correct values in subsequent calls to the same filter.

* Documented the problem identified by Chris Winters where an IF 
  used as a side-effect to an implied SET directive doesn't behave as
  expected.  A directive of the form  [% foo = 'bar' IF condition %]
  should be written explicitly as [% SET foo = 'bar' IF condition %]

* Documented the 32k size limit (or typically less) for templates when 
  the INTERPOLATE option is set.

#------------------------------------------------------------------------
# Version 2.00 beta 5  14th September 2000
#------------------------------------------------------------------------

* Added define_filter($name, \&filter, $is_dynamic) method to
  Template::Context to allow additional filters to be defined at any
  time.  Arguments are as per the FILTERS configuration option.
  These filters persist for the lifetime of the processor.

* Changed the Template::Context filter() method to accept a code 
  reference as the filter name and use it as the filter sub.  This 
  allows filters to be bound to template variables which are then 
  used as:

    [% FILTER $myfilter %]

  There is one catch, however.  TT will automatically call a subroutine
  bound to a variable when evaluated.  Thus you must wrap your filter
  sub in another sub: $stash->set('foo', sub { \&myfilter }); or bless
  it into some class (any class) to fool TT into thinking it's not a 
  subroutine ref: $stash->set('bar', bless \&myfilter, 'any_old_name');

* Updated documentation for FILTER directive and FILTERS option to 
  reflect the above changes.

* Fixed Template::Document to run cleanly with taint checking enabled.
  Unfortunately, this has been achieved by blindly untainting the
  generated template Perl code before calling eval().  Given that
  we're reading template source from external files, I don't think
  there's any way to do reliable taint check anyway.  But thankfully
  we can trust the parser to generate "safe" code unless EVAL_PERL is
  enabled in which case all bets are off anyway.

* Updated XML::DOM plugin to include changes made by Thierry-Michel 
  Barral to accept configuration options for XML::Parser.

* Fixed a bug in the Table plugin which caused the first item to be
  repeated n times when n items was less than a specified number of
  columns.  Thanks to Andrew Williams for finding and fixing this
  bug.

* The Template::Tutorial document really is included in the
  distribution this time.  Honest.


#------------------------------------------------------------------------
# Version 2.00 beta 4  12th September 2000
#------------------------------------------------------------------------

* Added the PROCESS config option which allows a template or templates
  to be specified which is/are processed instead of the template
  passed as an argument to the Template process() method.  The
  original template is available as the 'template' variable and can be
  processed by calling INCLUDE or PROCESS as [% INCLUDE $template %].

* Changed what was the CASE option to now be enabled by default, and
  then changed the name of the option to ANYCASE to make it more
  obvious as to what it did.  You must now specify directive keywords
  (INCLUDE, FOREACH, IF, etc) in UPPER CASE only, or enable the
  ANYCASE option to revert to the previous behaviour of recognising
  keywords in any case.  With the increase in reserved words in
  version 2, there is more chance of collision with variable names.
  It's a real pain not being able to have a variable called 'next', an
  exception called 'perl', etc., because there's a reserved word of
  the same name.  Thus, keywords are now UPPER CASE only by default,
  neatly side-stepping the problem.

* Changed the PERL directive so that output is generated by calling
  print() instead of using the final value in the block.  Implemented
  by tying STDOUT to an output buffer based on a patch sent in by
  Chuck Adams.

    new:                      old:
      [% PERL %]                [% PERL %]
         print "foo\n";            my $output = "foo\n";
         ...                       ...
         print "bar\n";            $output .= "bar\n";
      [% END %]			   $output;
                                [% END %]

* The IMPORT directive and magical IMPORT variable have been replaced 
  with a general purpose virtual hash method, import().

    [% hash1.import(hash2) %]   # was "hash1.IMPORT = hash2"
    [% import(hash1) %]	        # was "IMPORT hash1" or "IMPORT = hash1"

* Modified the Template::Filters provider to examine the FILTERS
  package hash reference (changed name from STD_FILTERS) each time a
  filter is requested rather than copying them at construction time.
  This allows new filters to be added on-the-fly.  See t/filter.t for
  examples and Template::Filters for more info.
  
* Added the 'nsort' list method which sorts items using a numerical 
  value sort rather than an alpha sort. 

    [% data = [ 1, 5, 10, 11 ] %]
    [% data.sort.join(', ')  %]     # 1, 10, 11, 5
    [% data.nsort.join(', ') %]     # 1, 5, 10, 11  

* Added 'div' operator to provider integer division (e.g. 'a div b' =>
  'int(a / b)' and 'mod' which is identical to '%' but added for backwards
  compatibility with V1.

* Changed the (undocumented) FORNEXT directive to NEXT and documented it.

* Fixed a bug in the persistant caching mechanism in Template::Provider
  which was failing to write compiled template files for source templates
  specifed in the form [% INCLUDE foo/bar %].  Intermediate directories 
  (like 'foo' in this example) weren't being created and the disk write 
  was failing.  Thanks to Simon Matthews for identifying this problem.

* Fixed an obscure bug in the Template::Stash which was ignoring the
  last element in a compound variable when followed by an empty 
  argument list.  e.g. [% cgi.param() %] would be treated as [% cgi %].
  Also fixed the DEBUG option so that undefined variables cause 'undef'
  exceptions to be raised.  Thanks to Jonas Liljegren for reporting the 
  problems.

* Added the reference operator, '\' which allows a "reference" to 
  another variable to be taken.  The implementation creates a closure
  around the referenced variable which, when called, will return the 
  actual variable value.  It is really a form of lazy evaluation, rather
  than genuine reference taking, but it looks and smells almost the same.
  Primarily, it is useful for allowing sub-routine references to be 
  passed to another sub-routine.  This is currently undocumented 
  because I'm not sure about the validity of adding it, but see t/refs.t 
  for examples for now.

* Changed parser to automatically unescape any escaped characters in 
  double quoted strings except for \n and \$.  This permits strings to
  be constructed that include tag characters.  e.g.

    [% directive = "[\% INSERT thing %\]" %]

* Fixed a bug in the use of the 'component' variable when the current
  component is a sub-routine rather than a Template::Document.

* Added the '--define var=val' option to tpage to allow template 
  variables to be defined from the command line.  Added support to
  ttree for various new Template configuration options.

* Added $Template::Test::PRESERVE package variable which can be set to 
  prevent newlines in test output from being automatically mangled to
  literal '\n'.

* Completed and corrected all knows bugs in the documentation which
  now weighs in at around 100 pages for the Template.pm module alone.
  The POD documentation should now be installed by default.  The
  Template::Tutorial document is once again included in the
  distribution.


#------------------------------------------------------------------------
# Version 2.00 beta 3  10th August 2000
#------------------------------------------------------------------------

* Added the WRAPPER directive to include another template, passing the 
  enclosing block as the 'content' variable.  e.g.

  somefile:                    mytable:
    [% WRAPPER mytable %]        <table>
       blah blah blah            [% content %]
    [% END %]                    </table>

  This is equivalent to:

    [% content = BLOCK %]
       blah blah blah
    [% END %]
    [% INCLUDE mytable %]

* Added the [% INSERT file %] directive to insert the contents of a disk
  file without processing any of the content.  Looks for the file in the
  INCLUDE_PATH and honours the ABSOLUTE and RELATIVE flags.  Added the
  insert($file) method to Template::Context which calls the new 
  load($file) method in Template::Provider which loads the file text
  without compiling it.

* Added the DEFAULT configuration option which allows you to specify a 
  default template which should be used whenever a named template 
  cannot be found.  This is ignored for templates specified with absolute
  or relative filenames, or as references to an input filehandle or text.

* Added a FORNEXT directive to step on to the next iteration of a
  FOREACH loop, as suggested/requested by Jo Ellen Wisnosky.  I chose
  FORNEXT rather than simply NEXT because 'next' is a very common
  variable name but I'm open to better suggestions.  Perhaps CASE
  should be set by default to prevent variable conflict?  This might
  change.

* Reorganised the Template::Filters modules and changed the calling 
  convention for requesting filters via the fetch() method.  This now
  expects a reference to the calling Template::Context object as the
  third parameter (after filter name and reference to a list of arguments).
  Static filter sub-routines are returned as before and the context has
  no effect.  Dynamic filter factories (denoted by a $is_dynamic flag
  in the FILTER_FACTORY table) are called to create a filter sub-routine
  (closure) for each request.  The context is now passed as the first
  parameter, followed by the expansion of any arguments.  Filter 
  factories should return a sub-routine or (undef, $error) on error.

* Added several new filters:
  - 'stderr' prints the output to STDERR (i.e. for generating output 
    in the Apache logfile, for example).  e.g. [% message | stderr %]

  - 'file' is the equivalent of the version 1 redirect() filter which 
    writes the output to a new file, relative to OUTPUT_PATH.  Throws
    a 'file' exception if OUTPUT_PATH is not set.  There should perhaps 
    be some other way to disable this without relying on OUTPUT_PATH.

  - 'eval' evaluates the input as a template and processes it.  Proposed
    by Simon Matthews for times when you might be returning templates 
    fragments from a database, for example.  e.g. [% dirtext | eval %]

  - 'evalperl' evaluate the input as Perl code, as suggested by Jonas
    Liligren. Requires the EVAL_PERL option to be set and will throw a 
    'perl' error if not (see later item).  e.g. [% perlcode | evalperl %]

* Fixed a bug in Template::Provider which was mangling the metadata items
  for the template name and modification time.  The [% template.name %] 
  and [% template.modtime %] variables now work as expected.

* Added 'component' variable, similar to 'template', but which references 
  the current template component file or block, rather than the top-level 
  template.  Of course, these may be one and the same if you're not nesting
  any templates.

* Template::Provider now reports errors raised when re-compiling 
  modified templates rather than ignoring them, thanks to a patch from
  Perrin Harkins.

* Fixed Template::Context to recognise the RECURSION option once more,
  thanks to a patch from Rafael Kitover.

* Overloaded "" stringification of Template::Exception to call as_string(),
  again thanks to Rafael.  In a catch block you can now simply say 
  [% error %] as well as the more explicit  [% error.type %] and/or 
  [% error.info %].

* Changed Template module (via Template::Service) to return the
  exception raised rather than a pre-stringified form.  This allows
  you to test the type() and/or info() if you want, or just print it
  and rely on the automatic stringification mentioned above to format
  it as expected.  Note that the top-level process($file) method
  returns a string rather than an exception if $file can't be found.
  This is a bug, or a possible "gotcha" at the very least, and should
  get fixed some time soon.  For now, test that the error is a
  reference before attempting to call info() or type().

* Fixed a bug preventing literal newlines from being used in strings.
  Thanks to Simon Matthews for bringing it to my attention by calling 
  my hotel room at the Perl Conference and saying "Hello?  Is that the 
  Template Toolkit Helpdesk?  I have a bug to report..."  :-) 
  (I fixed it on his laptop a few minutes later - good service, eh?)

* Changed Template::Parser to not compile PERL or RAWPERL blocks if
  EVAL_PERL is not set.  Previously they were compiled but switched out
  at runtime.  This was erroneous as rogue BEGIN { } blocks could still
  be executed, as noted by Randal Schwartz.  Any PERL or RAWPERL blocks
  encountered when EVAL_PERL is disabled will now cause a 'perl' exception
  to be thrown. 

* Added a define_block($name, $block) option to Template::Context to 
  add a definition to the local BLOCKS cache.  $block can be a reference
  to a template sub-routine or Template::Document object or template 
  text which is first compiled.

* Any other errors thrown in a PERL blocks (assuming EVAL_PERL set)
  are now left unchanged.  Previously, these were converted to 'perl'
  exceptions which prevented exceptions of other kinds being throw
  from within Perl code.

* Applied a patch from Chris Dean to fix a bug in the list 'sort' 
  method which was converting a single element list into a hash.  The
  sort now does nothing unless there's > 1 elements in the list.

* Changed Template::Stash set() method to append the assigned value to
  the end of any arguments specified, rather than prepending it to the 
  front.  e.g. The foo() method called by [% myobj.foo(x, y) = z %] now
  receives arguments as foo(x, y, z) instead of foo(z, x, y).

* Changed Template::Base::error() to accept a reference (e.g. exception)
  as the first parameter.  In this case, no attempt is made to 
  concatenate (and thereby stringify) the arguments.

* Added a direct stash() accessor method to Template::Context rather 
  than relying on the slower AUTOLOAD method.

* Added an iterator() method to Template::Config to require
  Template::Iterator and instantiate an iterator, and changed
  generated code for FOREACH to call this factory method.  This fixes
  a bug with pre-compiled (i.e persistant) templates which were
  failing if Template::Iterator wasn't already loaded.  Thanks to Doug
  Steinwand, Rafael Kitover and Jonas Lilegren who all identified the
  problem and hounded me until I fixed it.  :-)
 
* Fixed a problem with persistant templates not being reloaded due to 
  the %INC hash.  This caused 1 to be returned from require() instead 
  of the compiled template.

* Added ABSOLUTE and RELATIVE options to tpage by default.

* Applied various documentation and test patches from Leon Brocard.
  Fixed docs to quote dotted exception types to prevent string
  concatenation, as noted by Randal Schwartz.  Generally added a 
  whole lot more documentation.

#------------------------------------------------------------------------
# Version 2.00 beta 2   14th July 2000
#------------------------------------------------------------------------

* Added COMPILE_DIR option.  This allows you to specify a separate 
  directory in which compiled templates should be written.  The COMPILE_DIR
  is used as a root directory and each of the INCLUDE_PATH elements is 
  created below that point.  e.g. the following options

    COMPILE_DIR  => '/tmp/ttcache', 
    INCLUDE_PATH => '/user/foo/bar:/usr/share/templates',

  would create the following cache directories:

    /tmp/ttcache/user/foo/bar
    /tmp/ttcache/usr/share/templates

  Templates originating from source files in the INCLUDE_PATH are thus 
  written in their compiled form (i.e. Perl) to the relevant COMPILE_DIR
  directory.  The COMPILE_EXT option may also be used in conjunction with
  COMPILE_DIR to append a filename extension to all compiled files.
  
* Fixed memory leaks caused by the huge circular reference that is the 
  Template::Provider's linked list of cache slots.  Added a DESTROY method 
  which walks the list and explicitly breaks the chains (i.e. the NEXT/PREV
  links), thus allowing the compiled Template::Document objects to be 
  correctly destroyed and their memory repooled.  Thanks to Perrin Harkins
  for spotting the problem.

* Added a work-around in Template::Stash _dotop() to the problem of the 
  CGI module denying membership of the UNIVERSAL class on subsequent calls
  to UNIVERSAL::isa($cgi, 'UNIVERSAL').  It works correctly the first time,
  but returns false for all subsequent calls.  Changed this generic
  "is-an-object" test to UNIVERSAL::can($cgi, 'can') on the suggestion
  of Drew Taylor who identified the problem.

* Added t/macro.t to test MACRO directive, t/compile4.t and t/compile5.t
  to test the COMPILE_DIR option.

* More complete documentation, but not yet fully complete.


#------------------------------------------------------------------------
# Version 2.00 beta 1   10th July 2000
#------------------------------------------------------------------------

* Template::Context include()/process() now works with raw CODE refs.

* Template.pm now prefixes OUTPUT with the OUTPUT_PATH when OUTPUT
  is a file name.

* Cleaned up Template::Iterator.  Now derived from Template::Base.
  Removed ACTION and ORDER now that they are supported as list pseudo
  methods in the Stash LIST_OPS.

* Fixed bug in Provider preventing updated files from being automatically
  reloaded.  Thanks to Perrin Harkins who provided the patch.

* Fixed bug in Template::Plugin::Datafile which was preventing a comment
  from being placed on the first line of the file.

* Fixed bug in parse grammer preventing commas in a META list

* Added cache persistance by writing real Perl to file (rather than
  the previous Data::Dumper dump of the opcode tree).  Had to
  re-organise a bunch of code around the parser/provider/document.  
  Activated by COMPILE_EXT configuration item.

* Added a work-around in Template::Stash to the problem of CGI disclaiming
  membership of the UNIVERSAL class after the first method call.

* Added AUTO_RESET option which is enabled by default.  Disable this 
  (AUTO_RESET => 0) for block persistance across service invocations.

* Fixed \@ quoting (and others) in Directive thanks to Perrin Harkins 
  who reported the bug and Chuck Adams who provided a patch.

* Added Date plugin and test, as provided by Thierry-Michel Barral.

* Integrated changes to Template::Test from version 1.07 and beyond.  Now 
  supports -- process -- option in expect, mainly for use of t/date.t et al.

* Integrated new upper and lower filters from 1.08, and '|' alias for FILTER
  from 1.07.

* Added new directive.t test to test chomping and comments.

* BLOCKS can now be defined as template text which gets automatically 
  compiled into a Template::Document object.

* Integrated XML plugins and tests from version 1.07

* Fixed TRIM option to work with all BLOCKs and templates.  Moved TRIMing
  operation into context process() and include() methods.  Also changed
  service to call $context->process($template) rather than call the sub/
  doc itself, thus ensuring that the output can get TRIMmed.

* Updated Template::Plugin.pm

* Added '--define' option to ttree.

* Integrated various plugins and filters from v1.07

* Moved Template::Utils::output into Template.pm?) and got rid of
  Template::Utils altogether.

* Fixed bug in Context filter() provider method which wasn't caching 
  filters with args.

* [% CASE DEFAULT %] is now an alias for [% CASE %] (the default case),
  in consistency with [% CATCH DEFAULT %] / [% CATCH %]


#------------------------------------------------------------------------
# Version 2.00 alpha 1
#------------------------------------------------------------------------

* first public alpha release of Version 2.00
 


#========================================================================
#                           VERSION 2.00
#------------------------------------------------------------------------
# The following list outlines the major differences between version 1.*
# and version 2.00 of the Template Toolkit. 
#========================================================================

New Language Features
---------------------

* New SWITCH / CASE statement.  SWITCH takes an expression, CASE takes
  a value or list of values to match.  CASE may also be left blank or
  written as [% CASE default %] to specify a default match.  Only one
  CASE matches, there is no drop-through between CASE statements.
  
    [% SWITCH myvar %]
    [% CASE value1 %]
       ...
    [% CASE [ value2 value3 ] %]   # multiple values to match
       ...
    [% CASE myhash.keys %]         # ditto
       ...
    [% CASE %]                     # default, or [% CASE default %]
       ...
    [% END %]
  
* New TRY / CATCH / FINAL construct for fully functional, nested
  exception handling.  The block following the TRY is executed and
  output if no exceptions are throw.  Otherwise, the relevant CATCH
  block is executed.  CATCH types are hierarchical (e.g 'foo' catches
  'foo.bar') or the CATCH type may be left blank or specified as [%
  CATCH default %] to provide a default handler.  The contents of a
  FINAL block, if specified, will be processed last of all, regardless
  of the result (except an uncaught exception which is throw upwards
  to any enclosing TRY block).
  
    [% TRY %]
       ...blah...blah...
       [% CALL somecode %]	  # may throw an exception
       ...etc...
       [% INCLUDE someblock %]    # may have a [% THROW ... %] directive
       ...and so on...
    [% CATCH file %]		  # catch system-generated 'file' exception 
       ...
    [% CATCH DBI %]		  # catch 'DBI' or 'DBI.*'
       ...
    [% CATCH %]	                  # catch anything else
       ...
    [% FINAL %]		          # optional
       All done!
    [% END %]

* New CLEAR directive to clear the current output buffer.  This is typically 
  used in a CATCH block to clear the output of a failed TRY block.  Any output
  generated in a TRY block up to the point that an exception was thrown will
  be output by default.  The [% CLEAR %] directive in a catch block clears
  this output from the TRY block.

    [% TRY %]
       blah blah blah, this is the current output block
       [% THROW some.error 'Danger Will Robinson!' %]
       not reached...
    [% CATCH %]
       [% # at this point, the output block contains the 'blah blah...' line
          # up to the point where the THROW occured, but we don't want it
          CLEAR
       %]
       Here we can add some more text if we want...
    [% END %]

  In general, the CLEAR directive clears the current output from the
  template or enclosing block.

* New META directive allowing you to define metadata items for your
  templates.  These are attached to the compiled template and wrapped
  up as a Template::Document object.  The 'template' variable is a
  reference to the current parent document and metadata items may be
  accessed directly.  Of particular note is the fact that the
  'template' variable is correctly defined for all PRE_PROCESS and
  POST_PROCESS headers.  Thus, your headers and footers can access
  items from the main template (e.g. title, author, section, keywords,
  flags, etc) and display them or act accordingly.
  
  mytemplate:
    [% META 
       title     = 'This is a Test'
       author    = 'Andy Wardley'
       copyright = "2000, Andy Wardley" 
    %]
  
    <h1>[% template.title %]</h1>
    blah blah
  
  header:   (a PRE_PROCESS template)
    <html>
    <head><title>[% template.title %]</title></head>
    <body>
  
  footer:  (a POST_PROCESS template)
    <hr>
    &copy; Copyright [% template.copyright or '2000, MyCompany' %]

* New RAWPERL ... END block directive allows you to write raw Perl
  code which is integrated intact and unsullied into the destination
  template sub-routine.  The existing PERL ... END directive continues
  to be supported, offering runtime evaluation of a block which may
  contain other template directives, etc, which are first evaluated
  (e.g. PERL...END processes the block and filters the output into
  Perl evaluation at runtime).

* New INSERT directive which inserts the contents of a file without 
  processing it.

* New WRAPPER directive which processes the following block into the
  'content' variable and then INCLUDEs the named file.

    [% WRAPPER table %]
       blah blah blah
    [% END %]

    [% BLOCK table %]
    <table>
    [% content %]
    </table>
    [% END %]

* Comments now only extend to the end of the current line.

    [% # this is a comment
       a = 10
       # so is this
       b = 20
    %]

  Placing the '#' character immediately inside the directive will comment
  out the entire directive

    [%# entire directive
        is ignored
    %]

* The TAGS directive can now be used to switch tag styles by name.
  Several new tag styles are defined (e.g. html, asp, php, mason).

    [% TAGS html %]
    <!-- INCLUDE header -->

* The output from any directive or block can now be captured and assigned to 
  a variable.

    [% htext = INCLUDE header %]
    [% btext = BLOCK %]
       blah blah
       [% x %] [% y %] [% z %]
    [% END %]
  
    # you can even assign the output of loops, conditions, etc.
    [% numbers = FOREACH n = [2, 3, 5, 7, 11, 13] %]
       blah blah [% n %]
    [% END %]

* The handling of complex expressions has been improved, permitting
  basic directives to contain logical shortcut operators, etc.  All 
  binary operators now have the same precedence rules as Perl.

    [% foo or bar %]             # GET foo, or bar if foo is false (0/undef)
    [% CALL func1 and func2 %]   # func2 only called if func1 returns true
    [% name = user.id or cgi.param('id') %].

* A new "x ? y : z" operation is provided as a shorthand for
  "if x then y else z"

    [% foo = bar ? baz : qux %]

* A leading '$' on a variable is now used to indicate pre-interpolation
  of that element.  This simplifies the syntax and makes it consistent
  with double-quoted string interpolation and text block interpolation
  via the INTERPOLATE flag.  If you've been relying on the version 1
  "feature" that ignores the leading '$' then you'll need to change your
  templates to remove the '$' characters (except where you really want 
  them) or set the V1DOLLAR flag to 1 to revert to the version 1 
  behaviour.  See the 'Gotchas' section below for more details.

    # version 1
    [% hash.${key} %]  [% hash.${complex.key} %]

    # version 2
    [% hash.$key %]    [% hash.${complex.key} %]

* Various new pseudo-methods have been added for inspecting and manipulating
  data.  The full list now looks something like this:

      [% var.defined %]               # variable is defined
      [% var.length %]                # length of string
      [% var.split(delim, limit) %]   # split string as Perl does

      [% hash.keys %]                 # return list of hash keys
      [% hash.values %]               # ditto hash values
      [% hash.each %]                 # ditto keys and values
      [% hash.import(hash2) %]        # merge hash2 into hash

      [% list.size %]                 # number of items in list
      [% list.max %]                  # last item number (size - 1)
      [% list.first %]                # first item    
      [% list.last %]                 # last item
      [% list.push(item) %]	      # add item to end
      [% list.pop %]		      # remove item from end
      [% list.unshift(item) %]	      # add item to front
      [% list.shift %]	              # remove item from front
      [% list.reverse %]              # return reversed order
      [% list.sort(field) %]          # return alpha sorted order
      [% list.nsort(field) %]         # return numerical sorted order
      [% list.join(joint) %]          # return items joined into single string


Configuration Options
---------------------

* Template blocks may be pre-defined using the new BLOCKS option.  These
  may be specified as template text or as references to sub-routines or
  Template::Document objects.

    my $template = Template->new({
	BLOCKS => {
	    header => '<html><head><title>[% title %]</title></head><body>',
	    footer => '</body></html>',
	    funky  => sub { blah_blah($blah); return $some_text },
	}
    });

* Automatic error handling can be provided with the ERROR option.  This
  allows you to specify a single template or hash array of templates which
  should be used in the case of an uncaught exception being raised in the
  a template.  In other words, if something in one of your templates
  throws a 'dbi' error then you can define an ERROR template to catch
  this.  The original template output is discarded and the ERROR template
  processed in its place.  PRE_PROCESS and POST_PROCESS templates (e.g.
  header and footers) are left intact.  This provides a particularly 
  useful high-level error handling abstraction where you simply create
  templates to handle particular exceptions and provide the mapping 
  through the ERROR hash.

    my $template = Template->new({
	ERROR => {
	    dbi        => 'error/database.html',   # DBI error
	    'user.pwd' => 'error/badpasswd.html',  # invalid user password
	    user       => 'user/index.html',	   # general 'user' handler
	    default    => 'error/error.html',      # default error template
	}
    });

* The INCLUDE_PATH is now fully dynamic and can be changed at any time.
  The new Template::Provider which manages the loading of template files
  will correctly adapt to chahges in the INCLUDE_PATH and act accordingly.

* The LOAD_TEMPLATES option allows you to specify a list of one or more
  Template::Provider object which will take responsibility for loading
  templates.  Each provider can have it's own INCLUDE_PATH, caching
  options (e.g CACHE_SIZE) and so on.  You can sub-class the
  Template::Provider module to allow templates to be loaded from a
  database, for example, and then define your new provider in the
  LOAD_TEMPLATES list.  The providers are queried in order as a "Chain 
  of Responsiblity".  Each may return a compiled template, raise an
  error, or decline to serve the template and pass control onto the
  next provider in line.

* The CACHE_SIZE option defines a maximum number of templates that will
  be cached by the provider.  It is undefined by default, causing all
  templates to be cached.  A value of 0 disables caching altogether while
  a positive integer defines a maximum limit.  The cache (now built into
  Template::Provider) is much smarter and will automatically reload and
  compile modified source templates.

* The Template::Provider cache can write compiled templates (e.g. Perl code)
  to disk to create a persistant cache.  The COMPILE_EXT may be used to 
  specify a filename extension (e.g. '.ttc') which is used to create
  compiled template files.  These compiled template files 
  can then be reloaded on subsequent invocations using via Perl's 
  require() (which is about as fast as it can get).  The Template::Parser 
  and Template::Grammar modules are loaded on demand, so if all templates
  have been pre-compiled then the modules don't get loaded at all.  This 
  is a big win, given that Template::Grammar is the biggy.

* The ABSOLUTE and RELATIVE options are now used to enable the loading of
  template files (via INCLUDE or PROCESS) that are specifies with absolute
  (e.g. /tmp/somefile) or relative (e.g. ../tmp/another) filenames.  Both
  are disabled by default.

* The LOAD_PLUGINS option is similar to LOAD_TEMPLATES but allows you
  to specify one or more plugin providers.  These take responsibility
  for loading and instantiating plugins.  The Template::Plugins module
  is the default provider and multiplexes requests out to other
  Template::Plugin::* plugin modules.  Loading of plugins has been
  simplified and improved in general The PLUGINS option can be used to
  map plugin names to specific modules and PLUGIN_BASE can map plugins
  into particular namespaces.  The LOAD_PERL option can be used to
  load (almost) any regular Perl module and use it as a plugin.

* The LOAD_FILTERS option is similar to LOAD_TEMPLATES and LOAD_PLUGINS, 
  allowing one or more custom providers to be specified for providing
  filters.  The Template::Filters module is the default provider here.

* The TOLERANT option can be used to tailor the behaviour of providers
  (e.g. Template::Provider, Template::Plugins, Template::Filters) when
  they encounter an error.  By default, providers are not TOLERANT (0)
  and will report all failures as errors.  When TOLERANT is set to 1,
  they will ignore errors and return STATUS_DECLINED to give the next
  provider a chance to deliver a valid resource.

* The INTERPOLATE option is now automatically disabled within PERL and 
  RAWPERL blocks to prevent Perl $variables from being interpreted as 
  template variables.

    # INTERPOLATE = 1
    This $var will get interpolated...
    [% PERL %]
       # but these won't
       my $foo = 'some value';
       my $bar = 'another value';
       # etc...
    [% END %]
    now we're interpolating variables again, like $var

* Added the TRIM option to automatically removed leading and trailing 
  whitespace from the output of templates and BLOCKs.

* The CASE option has now been obsoleted and replaces by the ANYCASE 
  option.  See comments elsewhere in this document ('Gotchas' below and 
  notes for 2.00 beta 4) for further details.


Templates Compiled to Perl Code
-------------------------------

Templates are now compiled to Perl code, with credit and respect due
to Doug Steinwand for providing an implementation around which the
new parser was built.  This brings a number of important benefits:

* Speed and Memory Efficiency

  Version 1 used a list of opcodes to represent directives and
  lower-level operations.  These were evaluated by the hideously
  contrived, and darkly sinister Template::Context::_evaluate()
  method.  In version 2, all templates are parsed and rebuilt as Perl
  code.  This is then evaluated and stored as a reference to a Perl
  sub-routine which can then be executed and re-executed significantly
  faster and with far less memory overhead.

* Persistance.

  Once a template has been compiled to Perl code it can be saved to
  disk as a "compiled template" by defining the COMPILE_EXT option.
  This allows you to specify a filename extension (e.g. '.ttc') which
  is added to the template filename and used to create a new file
  containg the Perl code.  Next time you use the template, even if
  you've shut down your program/server/computer in the mean time, the
  compiled template is there in a file as Perl code and is simply
  require()d and executed.  It all happens significantly faster
  because there's no Template::Parser to run.  In fact, if all your
  templates are "compiled" on disk then the Template::Parser and
  Template::Grammar modules won't even be loaded, further reducing
  startup time and memory consumption (the grammar file, in particular
  is rather large).  The Template::Provider module handles the
  loading, caching and persistance of templates, and will examine file
  timestamps and re-compiled modified templates as required.

* Flexibility.  

  Because "compiled templates" are now nothing more than Perl
  sub-routines, you can use anyone or anything to generate them and
  run them all under the same roof.  Different parser back-ends can
  generate Perl code optimised for speed or functionality, for
  example.  Or different parsers can compile different template
  languages (PHP, ASP, Mason, roll-your-own, etc.) and run them
  alongside regular templates.  Or if you don't trust a parser, you
  can even write your own Perl code and have your templates execute as
  fast as the code you can write.


Other Enhancements and Internal Features
----------------------------------------

* Templates (i.e. sub-routines) now return their generated output,
  rather than sending it to $context->output().  This speeds things 
  up and makes the code simpler, as well as allowing greater 
  flexibility in how template sub-routines can work.

* Exceptions are now raised via Perl's die() and caught by an
  enclosing eval { } block.  Again, this simplifies the code generated
  and improves runtime efficiency.  The [% RETURN %] and [% STOP %]
  directives are now implemented as special case exceptions which are
  caught in the appropriate place and handled accordingly.

* Local named BLOCK definitions are better behaved and don't permanently
  mask any real files.  BLOCK definitions remain local to the template in 
  which they're defined, although they can be accessed from templates 
  INCLUDEd or PROCESSed from within.  The PROCESS directive will export 
  defined BLOCKs to the caller (as with variables) whereas INCLUDE will
  keep them "private".

* The Template::Stash object now encapsulates all the magical variable
  resolution code.  Both simple and compound variables can be accessed
  or updated using the get() and set() methods, with all variable binding
  magic happening automatically.

* The Template::Context object is now greatly simplified.  This acts
  as a general interface to the Template Toolkit functionality, being
  a collection of the various other modules that actually implement
  the functionality (e.g. Template::Stash, Template::Provider,
  Template::Document, Template::Plugins, etc.)

* The Template::Provider object provides a general facility for
  retrieving templates from disk (or other source), and if necessary
  compiling via a call to a Template::Parser helper object.  Multiple
  Template::Provider objects may be chained together, each with their
  own caching options, and so on.

* The Template::Parser object now compiles template text into Perl
  code and then evaluates it into a sub-routine reference using Perl's
  eval().  This is then wrapped up into a Template::Document object,
  including any metadata items and/or additional named BLOCKs defined
  in the input template.

* The Template::Document object is a thin wrapper around a compiled
  template sub-routine.  It provides a process() method for processing
  the template and a blocks() method for returning a reference to the
  hash array of any additional named BLOCKs defined in the original
  template text.  An AUTOLOAD method returns values of metadata items,
  allowing a Template::Document reference to be used as the 'template'
  variable.

* The Template::Service module provides a high-level service for
  processing templates, allowing PRE_PROCESS and POST_PROCESS templates
  to be specified along with an ERROR handling hash.

* The Template::Base module defines a common base class for many of
  the toolkit modules.  It implements shared functionality such as a
  constructor, error reporting and handling, etc.  Modules are now
  much easier to sub-class, all using separate new() and _init()
  methods.

* The Template::Config module provides methods for loading and
  instantiating different Template Toolkit modules.  Using this
  factory-based approach makes it far easier to change the default
  object class for a specific part of the toolkit.  e.g.

      use Template;
      use Template::Config;

      $Template::Config::PARSER = 'MyOrg::Template::MyParser';

      # $tt object will create and use a MyOrg::Template::MyParser 
      # object as PARSER
      my $tt = Template->new({ ... })

* The Template::Test module has been enhanced to make it easier to test
  more advanced TT features.  You can now define multiple TT processors
  and switch between them for different test with the '-- use name --'
  directive.  Also added the '-- process --' directive which can be
  added after '-- expect --' to hav the expected output processed by
  TT before comparison.

* The Template module remains, as it ever was, a simple front-end to
  the Template Toolkit.  This creates a single Template::Service to
  which it delegates control for processing templates.  Output is
  returned according to the OUTPUT options specified for the module
  and/or any output option passed explicitly to the process() method.


New Filters
-----------

* 'upper' and 'lower' filters perform case folding of text.

* 'eval' can be used to evaluate Template Toolkit directives at runtime.

* 'perl' evaluates Perl code if (and only if) the EVAL_PERL flag is set.

* 'stderr' is a simple filter to STDERR.

* 'file' is a new alias for the 'redirect' filter.  The OUTPUT_PATH option
  must be set.


New Plugins
-----------

* The DBI plugin is now distributed with the Template Toolkit.

* The Date plugin formats dates and times via the POSIX strftime() sub.

* The Iterator plugin provides access to the Template::Iterator module.

* The Dumper plugin provides an interface to the Data::Dumper module.

* The Wrap and Autoformat plugins interface to the Text::Wrap and 
  Text::Autoformat modules respectively.

* The XML::DOM and XML::XPath plugins provide interfaces to the relevant
  XML modules.


Utility Scripts
---------------

* Added the '--define var=val' option to ttree.


Gotchas
-------

Things that have changed between version 1 and 2 that might catch you 
out.  

* Bare CATCH blocks are no longer permitted and must be explicitly
  scoped with a matching TRY.  In most cases, this simply means adding
  a [% TRY %] to the start of any templates that define CATCH blocks,
  and ensuring that the CATCH blocks are moved to the end of the file
  (or relevant place).

       # version 1 - no longer supported
       blah blah blah...some error occurs

       [% CATCH some_kind_of_error %]
          handler template...
       [% END %]

       # version 2
       [% TRY %]
       blah blah blah...some error occurs...

       [% CATCH some_kind_of_error %]
          handler template...
       [% END %]

  Also be aware that this may change the expected output in case of
  errors.  By default, all output in the TRY block up to the point of
  error will be returned, with the relevant catch block, and then and
  further template output appended.  You can use [% CLEAR %] within a
  CATCH block to clear the output from the TRY block, if you prefer.
  TRY blocks can be nested indefinately.

* The ERROR directive is no longer supported.  It was very ill-defined
  anyway and serves no purpose that can't be acheived by defining
  custom filters, error handlers bound to template variables, or
  whatever.  I haven't implemented any special error or logging
  facilities, other than the general purpose exception handling, but
  welcome any thoughts on what or if anything else is needed.

* The ERROR option is also different.  It could previously be used
  to specify an error handling sub-routine, but is no longer required
  (see previous point).  The ERROR option in version 2 is used to 
  define a map of error types to template names for automatic 
  redirection for error handling.

* The current exception caught in a catch block is now aliased to the
  variable 'error' rather than 'e'.  This is much more logical, IMHO,
  and was only prevented previously by 'error' being a reserved word.
  Note that 'e' is still defined, in addition to 'error'.  This may be
  deprecated at some point in the future.

* The use of a leading '$' on variables is no longer optional, and
  should only be used to explicitly to indicate interpolatation of a
  variable name.  Most of the time you *don't* want to do this, so
  leave the '$' off.  This represent a slight shift away from the
  (optional) Perlness of the language, but I think it's a necessary
  step to improve the clarity and consistency of the language.

    As previously discussed on the mailing list, in interpolated text
  (i.e. a "double quoted" string or regular template text with
  INTERPOLATE set), both '$foo' or '${foo}' are interpolated as the
  value of the variable 'foo'.  This is good because it is a de-facto
  standard, consistent with Perl, shell, etc.  But inside a directive,
  [% $foo %] and [% ${foo} %] mean different things, the first being
  equivalent to [% foo %] or [% GET foo %] (the leading '$' is
  ignored) but the second actually fetching a variable whose name is
  stored in the variable 'foo'.  In other words, '${foo}' interpolates
  to the value of foo ('bar', say) and then this is used as the
  parameter to GET (which itself is optional).  Thus, in this case, [%
  ${foo} %] is [% GET ${foo} %] is [% GET bar %].

  This makes more sense if you look at the common example of
  accesing an entry from a hash array using the value of an variable
  as the key (e.g. $hash->{ $key }).  In version 1, the leading '$' on
  variables is ignored, meaning that the following are NOT identical.

      # version 1
      [% hash.$key   %]     # ERROR - '$' ignored => [% hash.key %]
      [% hash.${key} %]     # OK - '$key' is interpolated first

  It gets more confusing if you excercise your right to add optional
  leading '$'s in other places (which is one reason why I've always
  suggested against their use).

      # version 1 - same as above
      [% $hash.$key   %]
      [% $hash.${key} %]

  In particular, that last example should demonstrate the
  inconsistency.  Unlike interpolated text, '$...' and '${...}' are
  not treated the same and '$hash' is not interpolate while '${key}'
  is.  The only consistent solution I can see to this is to make both
  '$xxx' and '${xxx}' indicate interpolation in all cases, so that's
  what I've done.  In version 2, the syntax becomes a lot clearer and
  aligns more closely to a markup language than a programming
  language.  I think this is a Good Thing, but let me know what you
  think...

  Here's the Version 2 summary, assuming INTERPOLATE is set.

      # version 2
      my name is $name
      my name is $user.name
      my name is ${user.name}


      [% GET name %]                 [% name %]
      [% GET user.name %]            [% user.name %]
      [% GET people.fred %]          [% people.fred %]
      [% GET people.$name        %]  [% people.$name %]
      [% GET people.${user.name} %]  [% people.${user.name} %]

      [% INCLUDE header 
         title = "Home Page for $name"
      %]
      [% INCLUDE header
         title = "Home Page for $user.name"
      %]
      [% INCLUDE header
         title = "Home Page for ${user.name}"
      %]

* Changed default TAG_STYLE to only recognise [% ... %] and not the MetaText
  compatability %% ... %% style.  Set TAG_STYLE => 'template1' to accept both,
  or 'metatext' for just %% ... %%

* Changed how error/return values should be returned from user code.
  All errors should be thrown via one of the following:

    die $error_msg;
    die (Template::Exception->new($type, $info));
    $context->throw($msg);
    $context->throw($type, $info);
    $context->throw($exception);

* USERDIR and USERBLOCK are not supported (they were experimental and 
  undocumented, anyway)

* $Template::Directive::While::MAXITER is now 
  $Template::Directive::WHILE_MAX and may change again.

* into() filter is now obsolete.  You can now simply assign the output of
  another directive or block to a variable.

    [% x = INCLUDE foo %]
    [% y = BLOCK %]
       blah blah blah 
    [% END %]

* The CASE option has been removed and replaced with the ANYCASE option
  which is the logical opposite.  Directive keywords should now be UPPER
  CASE by default and the ANYCASE option can be enabled to revert to 
  the previous behaviour of accept keywords in any case.

* The IMPORT directive and magical variable have been removed and 
  replaced by a general purpose virtual hash method, import().
  [% IMPORT myhash %] should now be written [% import(myhash) %]
  and [% myhash.IMPORT = another.hash %] should be written as
  [% myhash.import(another.hash) %]