File: Changes

package info (click to toggle)
libtemplate-perl 2.24-1
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 8,660 kB
  • sloc: perl: 14,518; makefile: 15; sh: 5
file content (3711 lines) | stat: -rw-r--r-- 161,909 bytes parent folder | download | duplicates (2)
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
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
#========================================================================
#
# Changes
#
# DESCRIPTION
#   Revision history for the Template Toolkit.
#
# AUTHOR
#   Andy Wardley   <abw@wardley.org>
#
#========================================================================

#-----------------------------------------------------------------------
# Version 2.24 - 8th February 2012
#------------------------------------------------------------------------

* Added text virtual methods: upper, lower, ucfirst, lcfirst, squote,
  dquote, trim, collapse, html and xml.

* Fixed bug RT#67918 - Bug in Makefile.PL command line parsing when 2 =
  signs were in an arguement.

* Fixed bug RT#74335 - Added documentation for some methods that were 
  lacking it to keep Pod::Coverage happy.


#-----------------------------------------------------------------------
# Version 2.23 - 21st January 2012
#------------------------------------------------------------------------

* Fixed bug RT#47929 which caused the XS Stash to die mysteriously when
  calling code that used string evaluation (e.g. DateTime).

* Fixed bug RT#68722 so that list.defined('alpha') always returns false.

* Added the TRACE_VARS option to keep track of what variables are used
  in a template.  It's not documented yet.  See t/trace_vars.t for an
  example of use.

* Applied patch from RT#48989 to avoid Template::Plugin::Procedural
  from adding target class' methods AUTOLOAD and new methods multiple
  times (Jens Rehsack)

* Applied patch from RT#53451 to accept negative epoch times in 
  Template::Plugin::Date.

* Applied patch from Marc Remy to add $Template::Directive::WHILE_MAX 
  option to tpage.


#-----------------------------------------------------------------------
# Version 2.22 - 21st July 2009
#------------------------------------------------------------------------

* Changed pod coverage and kwalitee tests to only run when release 
  testing.


#-----------------------------------------------------------------------
# Version 2.21_02 - 4th July 2009
#------------------------------------------------------------------------

* Added UTF8 support to the XS Stash.
  https://rt.cpan.org/Ticket/Display.html?id=45842

* Fixed the truncate filter to handle lengths shorter than the '...' 
  string being appended on the end.
  https://rt.cpan.org/Ticket/Display.html?id=45617

* Fixed a bug in the parser/grammar to make NEXT/LAST work correctly
  inside nested loops.
  https://rt.cpan.org/Ticket/Display.html?id=40887

* Fixed a bug in Template::Plugin::Filter that was causing the weakened
  $self reference in a dynamic filter closure to be garbage collected
  too soon.  (NOTE: this has probably un-fixed a previous bug)
  https://rt.cpan.org/Ticket/Display.html?id=46691

* Applied patch to allow list.sort to sort on multiple fields.
  https://rt.cpan.org/Ticket/Display.html?id=40637


#-----------------------------------------------------------------------
# Version 2.21_01 - 4th July 2009
#------------------------------------------------------------------------

* Removed Template::Plugin::Autoformat and t/autoform.t.  They're now
  available as a separate distribution.

* Fixed some Win32 test failures and XS Stash compilation problems.


#-----------------------------------------------------------------------
# Version 2.21 - 30th June 2009
#------------------------------------------------------------------------

* Fixed a PRE_CHOMP bug that left \r characters lying around when 
  confronted with templates with DOS \r\n line endings.
  https://rt.cpan.org/Ticket/Display.html?id=43345

* Applied patch from Bradley Baetz to fix defblock #line numbers
  http://rt.cpan.org/Public/Bug/Display.html?id=47024


#-----------------------------------------------------------------------
# Version 2.20_4 (2.21 candidate) - 21st May 2009
#------------------------------------------------------------------------

* Added the even(), odd() and parity() methods to Template::Iterator to
  assist in making zebra tables.

* Removed a post-5.6 perlism in Template::Context that broke on 5.6.2
  https://rt.cpan.org/Ticket/Display.html?id=46250

* Replaced a whole bunch of UNIVERSAL::isa() calls with blessed/isa

* Applied a patch from Norbert Buchmüller to prevent the #line markers
  from being whitespaced away from the first column.
  https://rt.cpan.org/Ticket/Display.html?id=46269

* Applied a patch from Denis F. Latypoff to fix uri/url filters with 
  utf8 text
  https://rt.cpan.org/Ticket/Display.html?id=41173


#-----------------------------------------------------------------------
# Version 2.20_3 (2.21 candidate) - 20th May 2009
#------------------------------------------------------------------------

* Fixed the XS Stash to compile properly in threaded Perls.
  https://rt.cpan.org/Public/Bug/Display.html?id=46240

* Applied a patch to the XS Stash from Alexey A. Kiritchun to make the 
  scalar.length vmethod work correctly with utf8 strings.
  http://lists.tt2.org/pipermail/templates/2009-May/010803.html


#-----------------------------------------------------------------------
# Version 2.20_2 (2.21 candidate) - 17th May 2009
#------------------------------------------------------------------------

* Applied a patch to Template::Test from Andrew Ford to make it skip
  properly.
  http://lists.tt2.org/pipermail/templates/2009-March/010678.html

* Changed the ttree -v/--verbose option so be less verbose and only 
  report on things that have changed.  To make it more verbose (like
  previous versions), add a second -v/--verbose flag, e.g.

    $ ttree -v -v

* Also added the --summary option to tree to print a summary of what it
  did, and the --color/--colour option to make it print its verbose 
  messages in colour (on ANSI terminals).

* Applied a ttree patch from Lyle Brooks to allow ttree to accept a 
  directory name as a command line argument.

* Added the define_view() and define_views() method to Template::Context
  and added the VIEWS option to pre-define views when the Template object
  is created.  Thanks to Timmy Chan for providing the groundwork on this.
  http://lists.tt2.org/pipermail/templates/2009-April/010689.html

* Retrospectively fixed the Changes for 2.20 to mention the ttree 
  --encoding option.

* Applied a patch from Chisel Wright, changing uses of UNIVERSAL::can() 
  to use blessed() and ->can().  
  http://lists.tt2.org/pipermail/templates/2009-May/010790.html

* Fixed a memory leak in the XS Stash introduced in 2.20.
  Thanks to Breno G. de Oliveira for reporting the problem and helping to 
  narrow it down.
  https://rt.cpan.org/Public/Bug/Display.html?id=46058


#------------------------------------------------------------------------
# Version 2.20_1 (2.21 candidate) - 7th April 2009
#------------------------------------------------------------------------

* Deleted all the old HTML documentation (now available separately from
  http://tt2.org/download/index.html#html_docs), examples, libraries and
  other cruft that was way out of date and badly unloved.

* Tweaked Template::Parser to work better with the ANYCASE option.  It
  now knows that anything following a dotop cannot be a keyword so that
  you can write data.last without the 'last' bit being interpreted as the 
  LAST keyword.  Thanks to Sean McAfee for the post that inspired it.
  http://lists.tt2.org/pipermail/templates/2008-September/010462.html

* Fixed a broken test for Apache::Util in the html_entity filter.  Added
  the use_html_entities() and use_apache_util() class methods to 
  Template::Filters to allow end-user selection of one or the other.
  http://rt.cpan.org/Public/Bug/Display.html?id=40870
  http://template-toolkit.org/svnweb/Template2/revision/?rev=1177

* Tweaked Template::Context to recognise Badger::Exception objects and
  convert them to Template::Exception objects.  This is a temporary
  measure to keep things working during the transition to Badger-based
  modules.

* Added the STRICT option which will cause the stash to throw an 
  exception on encountering an undefined value.  Thanks to Ben Tilly 
  for the prod.

* Applied a patch to Template::Iterator from Jonathon Padfield to make
  get_all() do the right thing if get_first() hasn't been called.

* Applied a patch to Template::Stash::Context from Ben Tilly to make
  it easier to subclass.

* Applied a patch from Robin Berjon to add the xml filter.


#------------------------------------------------------------------------
# Version 2.20 - 13th August 2008
#------------------------------------------------------------------------

* Updated all the documentation.

* Restored the GIF images that got mangled in the switch from CVS to
  Subversion.

* Fixed the Makefile.PL to pre-glob the tests to keep things working 
  smoothly in Win32.
  http://rt.cpan.org/Ticket/Display.html?id=25573
  
* Applied a patch to Template::Directives from Ben Morrow to fix the 
  SWITCH/CASE directive when matching strings containing regex metacharacters.
  http://rt.cpan.org/Ticket/Display.html?id=24183

* Applied a patch to Template::Parser from Koichi Taniguchi to make it
  treat TAGS with case sensitivity.
  http://rt.cpan.org/Ticket/Display.html?id=19975

* Changed html_entity_filter_factory() in Template::Filters to only look for 
  Apache::Utils and HTML::Entities once.
  http://rt.cpan.org/Ticket/Display.html?id=19837


Template::Stash
---------------

* Applied a patch to Template::Stash from Jess Robinson which allows you
  to call a list method on a single object and have it automatically
  upgraded to a single item list.  Changed the XS Stash to do the same.
  http://lists.tt2.org/pipermail/templates/2006-November/009115.html

* Fixed a minor bug in the XS Stash which prevented it from updating
  hash entries with empty, but defined keys.  Thanks to Yitzchak 
  Scott-Thoennes for reporting the problem.
  http://lists.tt2.org/pipermail/templates/2007-November/009819.html
  
* Applied a patch from Alexandr Ciornii  to make the XS Stash compile 
  cleanly under VC++ 6.0 and with Sun's C compiler.
  http://rt.cpan.org/Ticket/Display.html?id=20291


Template::Provider
------------------

* Fixed a minor bug in the Template::Provider code added in 2.19 that 
  caused errors in templates to only be reported once.  Subsequent
  fetches incorrectly returned 'not found' instead of repeating the 
  error.

* Made Template::Provider use File::Spec->catfile instead of using '/'
  and letting Perl worry about Doing The Right Thing.
  http://rt.cpan.org/Ticket/Display.html?id=34489

* Applied patch from Lyle Brooks to add binmode to the _template_content() 
  method in Template::Provider.
  http://rt.cpan.org/Ticket/Display.html?id=38075

* Applied patch from Ted Carnahan to silence UNIVERSAL::isa warnings in
  Template::Provider.  
  http://rt.cpan.org/Ticket/Display.html?id=25468

* Applied patch to Template::Provider from Andrew Hamlin which works around 
  a bug in Strawberry Perl on Win32.  
  http://rt.cpan.org/Ticket/Display.html?id=34578


Template::VMethods
------------------

* Applied a patch from Paul "LeoNerd" Evans to make the list.slice vmethod
  work properly with negative indices.
  http://lists.tt2.org/pipermail/templates/2008-March/010105.html


Plugins
-------

* Added the Math plugin and related files to the MANIFEST so they 
  actually get shipped out as part of the distribution.  D'Oh!  
  http://rt.cpan.org/Ticket/Display.html?id=27375

* Added the Scalar plugin which adds the .scalar vmethod for calling
  object methods and subroutines in scalar context.

* Added Template::Plugin::Assert which allows you to assert that values
  are defined.

* Changed Template::Plugin::Filter to weaken the $self reference to avoid
  circular references and memory leaks.  Thanks to Masahiro Honma for
  reporting the problem and suggesting the fix.

* Applied patch from Ronald J Kimball to make Template::Plugin::Date accept 
  dates with the year coming first.
  http://lists.tt2.org/pipermail/templates/2007-July/009540.html

* Added C<1;> to the end of a few plugin modules that were missing it.

ttree
-----

* Changed the --accept option in ttree to match against the full file
  path (relative to --src dir) rather than just the file name.  This 
  makes it behave the same way as the --ignore option.
  
* Applied patch from Lyle Brooks to add binmode to the process() 
  call in ttree.   
  http://rt.cpan.org/Ticket/Display.html?id=38076
  
* Added a patch from Nigel Metheringham also to set binmode in ttree
  but via a configuration option.
  https://rt.cpan.org/Ticket/Display.html?id=30760

* Applied a patch from Éric Cholet to add the --encoding option to ttree.
  http://lists.tt2.org/pipermail/templates/2008-August/010369.html


#------------------------------------------------------------------------
# Version 2.19 - 27th April 2007
#------------------------------------------------------------------------

* Applied a patch to t/fileline.t from Steffen Müller which fixes the
  problems running on Win32 with backslashes in paths.

  https://rt.cpan.org/Ticket/Display.html?id=20488
  
* Applied a patch to the XS Stash from Randy Kobes which fixes some other
  Win32 problems.
  
  http://lists.tt2.org/pipermail/templates/2007-February/009247.html

* Applied another patch to the XS Stash from Steve Peters which fixes
  a problem with tied hashes under more recent version of Perl.

  http://lists.tt2.org/pipermail/templates/2007-January/009181.html

* Fixed a problem in the Perl Stash when using objects that have 
  overloaded comparison operators.  Thanks to Randal Schwartz, Tatsuhiko 
  Miyagawa and Daisuke Maki for their contributions.

  http://lists.tt2.org/pipermail/templates/2007-March/009265.html

* Applied a patch from Bill Moseley to Template::Provider which adds 
  negative caching and moves some functionality into separate methods
  to make subclassing easier.  Also added the STAT_TTL configuration
  parameter.
  
  http://lists.tt2.org/pipermail/templates/2007-January/009183.html

* Added the url filter as a less aggressive form of the uri filter.
  Whereas the uri filter now (from v2.16 onwards) encodes all the 
  reserved characters (@, :, /, etc.) as per RFC2396, the url filter
  leaves them intact and thus behaves just like the uri filter used
  to.
  
  http://lists.tt2.org/pipermail/templates/2007-March/009277.html

#------------------------------------------------------------------------
# Version 2.18a - 9th February 2007
#------------------------------------------------------------------------

* Applied a patch from Steve Peters to the Stash.xs to allow it to 
  compile with bleadperl 5.9.x

  https://rt.cpan.org/Public/Bug/Display.html?id=22506

#------------------------------------------------------------------------
# Version 2.18 - 9th February 2007
#------------------------------------------------------------------------

* Merged in Adam's changes in 2.16 and 2.17 back into the developer CVS
  repository and added his name to the credits.

* Changed the parser grammar to accept expressions as arguments to a 
  subroutine, method or virtual method call.  I'm embarrassed to admit
  that it was a one line change that could (and should) have been made
  long ago, if only I had realised just how trivial it was.  Anyway,
  you can now write nested expressions like this:

     [% add(a+5, b < 10 ? c : d + e*5) %]

* Put the t/fileline.t test back in as this was fixed in 2.15a

* Added the Template::Toolkit documentation-only module.

#------------------------------------------------------------------------
# Version 2.17 - 8th Feb 2007
#------------------------------------------------------------------------

Another interim release from Adam Kennedy.

* Change in Makefile.PL to force an upgrade to File::HomeDir 0.64 on darwin. 
  This is due to problems caused by changes made to Perl on the new Intel 
  versions of Mac OS X.

* skip_all filelines.t on darwin

#------------------------------------------------------------------------
# Version 2.16 - 23rd Jan 2007            
#------------------------------------------------------------------------

Interim release from Adam Kennedy.

* Skip fileline.t on Win32, as it has some hard-coded path seperator
  assumptions. This will be fixed more comprehensively later.

* Handle spurious errors in Makefile.PL when a dev version of
  ExtUtils::MakeMaker is installed.

* Don't say "nmake" on Win32 when $Config{make} is 'dmake'.
  This corrects the message on Strawberry Perl.


#------------------------------------------------------------------------
# Version 2.15c - Not released                    ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Fixed a bug in Template::Parser which caused it to get confused about
  block names if it encountered a syntax error inside a BLOCK.  Thanks
  to Bill Moseley for reporting the problem.  
  
  http://lists.tt2.org/pipermail/templates/2006-July/008815.html

* Fixed a minor buglet in Template::Provider which came to light while
  investigating the above problem. If a previously cached template is changed
  on disk and then fails to compile, the provider now invalidates the cache
  entry immediately. Without this fix, the provider would report the error
  once, then reuse the cached good version of the template until $STAT_TTL
  ticked over when it would try to load and compile the disk version again.
  The problem was that error messages were only reported once every $STAT_TTL
  second(s) and any requests for the same template in the interim time would
  mysteriously work. This way errors get reported consistently and immediately
  and no-one has to waste an afternoon trying to figure out where the errors
  went!

#------------------------------------------------------------------------
# Version 2.15b - 30th May 2006                   ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Changed the uri filter to escape all reserved characters as per 
  URI::Escape and RFC2396.  This now includes &, @, /, ;, :, =, +, ?
  and $ which were previously not escaped.  Thanks to islue@cpan.org
  for reporting the problem.

  http://rt.cpan.org/Ticket/Display.html?id=19593

* Also changed the uri filter to encode all wide characters as the 
  equivalent UTF escapes.  Thanks to Jonathan Rockway for reporting 
  the problem.

  http://rt.cpan.org/Ticket/Display.html?id=19354

* Fixed the redirect filter to not support relative paths.  Thanks to
  Paul Seamons for spotting the problem and providing a solution.

* Moved all the virtual methods out of Template::Stash and into 
  a new Template::VMethods module.

* Fixed the version number of Template::Stash which had rolled over
  to 2.102 making it appear to predate the 2.86 stash in TT v2.14.
  Thanks to Randal Schwartz for reporting the problem.  Changed all 
  version numbers in other modules to be a hard-coded numbers instead
  of grokking it automagically from the CVS revision.

* Changed the _recover() method of Template::Service to check if the 
  error thrown is a Template::Exception object rather than just a 
  reference.  Thanks to David Wheeler for reporting the problem.

  http://rt.cpan.org/Ticket/Display.html?id=17630

* Fixed the some tests in stash.t and stash-xs.t which were failing 
  under Perl 5.6.2 due to a slightly different error message being 
  generated.  Thanks to Anton Berezin for reporting the problem.

* Fixed a bug in the Template::Provider _load() method to check that 
  $data is a hash ref before trying to mess with its innards.  Thanks
  to barbie@cpan.org for reporting the problem.

  http://rt.cpan.org/Ticket/Display.html?id=18653


#------------------------------------------------------------------------
# Version 2.15a - 29th May 2006                   ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

* Removed the latex filter from Template::Filters and related config
  variables from Template::Config

* Changed the t/fileline.t test to remove the line number from what Perl
  reports as "(eval $line)".  It appears to get the $line wrong on 
  FreeBSD, although the correct line number is reported following that
  so the tests still do the right thing.  Thanks to Anton Berezin for 
  reporting the problem.

* Changed the t/compile3.t test to do something similar.


#------------------------------------------------------------------------
# Version 2.15 - 26th May 2006
#------------------------------------------------------------------------

Chomping Options
----------------

* Added the CHOMP_GREEDY option and '~' chomping flag.  Changed 
  CHOMP_COLLAPSE to greedily chomp all whitespace (including multiple
  newlines) and replace it with a single space.  Previously it only
  chomped one line.  Renamed the CHOMP_ALL option to CHOMP_ONE which
  makes more sense.  CHOMP_ALL is still provided as an alias for 
  CHOMP_ONE for backwards compatibility.  Thanks to Paul Seamons for
  doing all the hard work on this.

  http://lists.tt2.org/pipermail/templates/2006-February/thread.html#8354

* Added code to the replace text virtual method to use a faster and 
  simpler implementation if the replacement text doesn't contain any
  back references.  Thanks to Josh Rosenbaum for all his efforts on 
  this.

  http://lists.tt2.org/pipermail/templates/2006-February/008344.html

Stash
-----

* Changed various tests for private/hidden variables (starting '_' 
  or '.') to use a regex defined in the $PRIVATE package variable in 
  Template::Stash.  This can be redefined or undefined.  Note that 
  the XS Stash only looks to see if $PRIVATE is defined or not, and
  currently hard-codes the regex.

Plugins
-------

* Changed the Image plugin tag() method to call the name() method 
  instead of accessing the name directly, making it easier for
  subclasses to provide an alternate name.  Thanks to Cees Hek for 
  his patch.

  http://lists.tt2.org/pipermail/templates/2006-February/008423.html

* Change the AUTOLOAD regex in the Table plugin to be more robust.

  http://lists.tt2.org/pipermail/templates/2006-May/008602.html

Documentation
-------------

* Added the Template::Toolkit documentation pointing people to 
  the right place.

* Updated the Template::Stash::XS documentation to remove the 
  "experimental" description and tidy things up a bit. 


#------------------------------------------------------------------------
# Version 2.14a - 2nd February 2006               ## DEVELOPER RELEASE ##
#------------------------------------------------------------------------

Stash
-----

* Activated a patch in Template::Stash from Stephen Howard which adds
  code for the full set of fallbacks for dot ops called against
  objects which don't implement the specific method.  For example 
  [% hashobj.vmethod %] [% listobj.2 %] and [% listobj.vmethod %] now 
  all work with the Perl Template::Stash.  Added code to the XS Stash 
  to do the same and updated tests.

  http://template-toolkit.org/pipermail/templates/2003-December/005417.html

* Added full support for tied hashes and tied lists in the XS Stash.
  Added some further tests to make sure it's all working as expected.

  http://lists.tt2.org/pipermail/templates/2006-January/008266.html

* Applied path from Slaven Rezic to Template::Stash::XS to check
  return code in tt_fetch_item() in a way which plays nicely with tied
  hashes.

  http://rt.cpan.org/Ticket/Display.html?id=7830

* Changed Template::Stash and Template::Stash::XS to evaluate list
  vmethods in lvalues.

  http://lists.tt2.org/pipermail/templates/2006-January/008198.html

* Changed Template::Stash to be a little more strict about what it
  considers a failed method call.  This allows exception thrown within
  called methods to be propagated correctly rather than being ignored
  as undefined method.  Thanks to Dave Howorth, Tom Insam and Stig 
  Brautaset for reporting the problem and providing fixes.

  http://lists.tt2.org/pipermail/templates/2005-April/007375.html
  http://lists.tt2.org/pipermail/templates/2006-February/008367.html

* Removed redundant performance profiling code from
  Template::Stash::XS.  Must check with Doug that this is OK and he's
  not still using it...


Virtual Methods
---------------

* Added the scalar.remove, scalar.substr, hash.delete, hash.items,
  hash.pairs, list.import and list.hash virtual methods.

* Changed the scalar.replace method to work properly with back
  references ($1, $2, etc) by incorporating ideas, code and tests from
  Nik Clayton, Paul Seamon, Sergey Martynoff, Josh Rosenbaum and
  others.

  http://lists.tt2.org/pipermail/templates/2006-February/008306.html
  http://lists.tt2.org/pipermail/templates/2006-February/008326.html

* Changed list.push and list.unshift to accept multiple arguments,
  thanks to Bill Moseley.

  http://lists.tt2.org/pipermail/templates/2006-January/008294.html

* Fixed the split scalar virtual method which wasn't accepting the
  second argument (limit) correctly.  Thanks to Josh Rosenbaum for
  pointing out the problem.

  http://lists.tt2.org/pipermail/templates/2005-October/007982.html

* Documented the fact that hash.list is going to change in the future,
  recommending people switch to hash.pairs.

  http://lists.tt2.org/pipermail/templates/2006-January/008256.html
  http://lists.tt2.org/pipermail/templates/2006-February/008312.html

* Added the global option to the 'match' scalar virtual method.

* Changed $element to $component in Template::Context to fix callers
  bug, thanks to Andy Maas who identified the problem and found the
  solution:

  http://lists.tt2.org/pipermail/templates/2004-December/007020.html

* Changed the sort and nsort list virtual methods to always return
  references to lists, avoiding any ambiguity in return results.

* Changed the hash.defined method to do the same thing as
  scalar.defined when called without arguments.  Added list.defined to
  do the same thing as hash.defined.

  http://rt.cpan.org/Ticket/Display.html?id=9094

* Moved all the tests into t/vmethods/*


Plugins
-------

* Added the $Template::Plugins::PLUGIN_BASE package variable to define
  the default 'Template::Plugin' value for the PLUGIN_BASE option.  By
  clearing this value before calling the Template new() constructor,
  you can avoid having Template::Plugin added to the PLUGIN_BASE by
  default.  Also changed PLUGINS search to look for lower case plugin
  name as well as case-specific name.  Thanks yet again Josh for
  addressing this issue.

  http://lists.tt2.org/pipermail/templates/2006-January/008225.html

* Applied a single character patch from Lubomir Host which fixes the 
  user attribute in Template::Plugin::File.

* Added the Math Plugin to MANIFEST.

* Changed the URL plugin to ignore parameters that are unset (e.g. 
  defined but zero length)

* Applied two patches to the Image plugin from Bill Moseley to escape
  attributes in the tag() method and to provide the 'file' options.
  Also adds proper documentation for the 'root' option.

  http://lists.tt2.org/pipermail/templates/2005-November/008086.html
  http://lists.tt2.org/pipermail/templates/2005-December/008189.html

* Added the $JOINT package variable to Template::Plugin::URL to 
  provide a work-around for the URL plugin which incorrectly (as
  we now know) encodes '&' as '&amp;'

  http://rt.cpan.org//Ticket/Display.html?id=11551
  http://lists.tt2.org/pipermail/templates/2005-December/008158.html

* Added substr() method to the String plugin, as suggested here:

  http://rt.cpan.org/Ticket/Display.html?id=2619

* Moved all XML plugins and related tests into a separate Template-XML
  distribution.

* Moved DBI plugin and tests into Template-DBI distribution.

* Moved GD plugins and tests into Template-GD distribution.


Filters
-------

* Applied a patch to the truncate() filter from "Ashley" which 
  adds a second argument.

  http://lists.tt2.org/pipermail/templates/2005-December/008145.html

* Fixed a bug in the same truncate() filter to stop it from truncating
  strings that are exactly as long as the limit (change '<' to '<='),
  thanks to Nicholas at oxhoej.dk.

  http://rt.cpan.org/Ticket/Display.html?id=8911

* Added "use locale" to Template::Filters to enable locale-specific
  filters.

  http://rt.cpan.org/Ticket/Display.html?id=9094
  http://rt.cpan.org/Ticket/Display.html?id=5695

* Updated documentation to reflect the fact that the html filter also
  escapes " as &quot; Thanks to Geoff Richards for reporting it.

* Moved Latex filters into Template-Latex distribution.


ttree
-----

* Applied patch from Yuri Pimenov to prevent ttree from raising a 
  warning when the --depend_debug option is used.

  http://lists.tt2.org/pipermail/templates/2005-May/007400.html

* Applied a patch to ttree from Slaven Rezic which fixes the arguments
  passed to mkpath.

  http://rt.cpan.org//Ticket/Display.html?id=14216

* Applied a patch to ttree from Mike Schilli to prevent it from going
  into an infinite loop on encountering a directory called "0"

  https://rt.cpan.org/Ticket/Display.html?id=14905

* Fixed configuration section to not prompt "Do you want me to create
  a sample .ttreerc file?" if the -h/--help options are specified, 
  thanks to Slaven Rezic for reporting the problem.

  http://rt.cpan.org/Ticket/Display.html?id=4180

* added AppConfig EXPAND => EXPAND_ALL option to perl5lib, 
  template_plugin_base, template_compile_dir and depend_file
  configuration options to allow them to contain ~ to indicate
  the user's home directory, or $WHATEVER for environment variables,
  as per the other path-specific options like src, lib, etc.

Miscellaneous
-------------

* Added code to Makefile.PL to detect $ENV{PERL_MM_USE_DEFAULT} to 
  accept all defaults.  Thanks to KANE.

  http://rt.cpan.org/Ticket/Display.html?id=14613

* Removed vStrings from Template::Document.  Thanks to Dave Cross for
  reporting the problem.

  http://lists.tt2.org/pipermail/templates/2005-April/007357.html

* Applied a patch from Barrie Slaymaker which corrects a bug in the
  Template::Parser line counting when using chomp flags.

  http://lists.tt2.org/pipermail/templates/2005-December/008157.html

* Applied a patch from Jess Robinson to move the Template::Provider
  check for file freshness into a separate method, in order to 
  play nicely with his Template::Provider::DBI module.

  http://lists.tt2.org/pipermail/templates/2005-December/008143.html

* Fixed the regex matching relative paths in Template::Provider, thanks
  to Josh Rosenbaum 

  http://lists.tt2.org/pipermail/templates/2005-January/007141.html

* Applied a patch to Template::Provider to prevent a misleading error
  message, thanks to Slaven Rezic.

  http://rt.cpan.org/Ticket/Display.html?id=5327

* Added an eval wrapper around mkpath() in Template::Provider to handle
  errors more nicely.

* Numerous documentation fixes.



#------------------------------------------------------------------------
# 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://lists.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://lists.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://lists.tt2.org/pipermail/templates/2003-April/004553.html
  http://lists.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://lists.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://lists.tt2.org/pipermail/templates/2003-June/004761.html

* Applied a patch from Ivan Adzhubey to template/splash/frame.
  http://lists.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://lists.tt2.org/pipermail/templates/2003-October/005110.html
  http://lists.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://lists.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://lists.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://lists.tt2.org/pipermail/templates/2003-July/004783.html
  http://lists.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://lists.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://lists.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://lists.tt2.org/pipermail/templates/2003-February/004290.html

* Applied Pudge's patch for the XS Stash bug.  See
  http://lists.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://lists.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://lists.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://lists.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://lists.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://lists.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://lists.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://lists.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://lists.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 persistent 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 persistent 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 persistent) 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 persistent 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 persistence 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 persistence 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 persistent 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.

* Persistence.

  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 persistence 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) %]