• Home
  • History
  • Annotate
  • only in this directory
NameDateSize

..01-Mar-2013104

ChangeLogH A D07-Jun-201042.3 KiB

dictionary.txtH A D07-Aug-20064.8 KiB

license.txtH A D15-Jul-20032.1 KiB

main1.tclH A D16-Nov-2009124.8 KiB

main1_83.tclH A D28-Sep-2009125.5 KiB

main2.tclH A D16-Nov-2009122.3 KiB

modules.txtH A D06-Aug-2006440

pkgIndex.tclH A D07-Jun-2010208

README.tcl83.txtH A D27-Sep-20052.4 KiB

README.txtH A D20-Sep-200631.6 KiB

roadmap.txtH A D18-Sep-20046.1 KiB

roadmap2.txtH A D20-Aug-20056 KiB

snit.manH A D07-Jun-201089.5 KiB

snit.tclH A D07-Jun-20101.1 KiB

snit.testH A D07-Jun-2010201.9 KiB

snit2.tclH A D07-Jun-2010769

snit_tcl83_utils.tclH A D16-Sep-20066.2 KiB

snitfaq.manH A D30-Apr-2010116.5 KiB

validate.tclH A D07-Jun-201018.5 KiB

README.tcl83.txt

1#--------------------------------------------------------------------------
2# README.tcl83.txt
3#--------------------------------------------------------------------------
4# Back-port of Snit to Tcl83
5#--------------------------------------------------------------------------
6# Copyright
7#
8# Copyright (c) 2005 Kenneth Green
9# All rights reserved
10#--------------------------------------------------------------------------
11# This code is freely distributable, but is provided as-is with
12# no warranty expressed or implied.
13#--------------------------------------------------------------------------
14# Acknowledgements
15#   1) The changes described in this file are made to awesome 'snit' 
16#      library as provided by William H. Duquette under the terms
17#      defined in the associated 'license.txt'.
18#--------------------------------------------------------------------------
19
20Snit is pure-Tcl object and megawidget framework.  See snit.html
21for full details.
22
23It was written for Tcl/Tk 8.4 but a back-port to Tcl/Tk 8.3 has been
24done by Kenneth Green (green.kenneth@gmail.com).
25
26-----------------------------------------------------------------
27
28The back-port to Tcl 83 passes 100% of the snit.test test cases.
29It adds two files to the package, this README file plus the back-port
30utility file: snit_tcl83_utils.tcl.
31
32Very few changes were required to either snit.tcl or snit.test to
33get them to run with Tcl/Tk 8.3. All changes in those files are
34tagged with a '#kmg' comment.
35
36-----------------------------------------------------------------
3707-Jun-2005 kmg (Release 1.0.1)
38    Port of first full snit release 1.0
39    Passes 452/452 test cases in snit.test
40    Known problems:
41	1) In some cases that I have not been able to characterise, an instance 
42           will be destroyed twice causing an error. If this happens, try wrapping
43           your deletion of the instance in a catch.
44	2) As a consequence of (1), one test case generates an error in its
45           cleanup phase, even though the test itself passes OK
46
47
4810-Feb-2005 kmg (Beta Release 0.95.2)
49    Fixed bug in 'namespace' procedure in snit_tcl83_utils.tcl.
50    Made it execute the underlying __namespace__ in the context
51    of the caller's namespace.
52
5328-Aug-2004 kmg (Beta Release 0.95.1)
54    First trial release of the back-port to Tcl/Tk 8.3
55    Snit will work fine on Tcl/Tk 8.4 but a few of the tests
56    will have to have the changes commented out and the original
57    code uncommented in order to pass.
58

README.txt

1Snit's Not Incr Tcl README.txt
2-----------------------------------------------------------------
3
4Snit is pure-Tcl object and megawidget framework.  See snit.html
5for full details.
6
7Snit is part of "tcllib", the standard Tcl Library.
8
9Snit lives in "tcllib" now, but it is available separately at
10http://www.wjduquette.com/snit.  If you have any questions, bug
11reports, suggestions, or comments, feel free to contact me, Will
12Duquette, at will@wjduquette.com; or, join the Snit mailing list (see
13http://www.wjduquette.com/snit for details).
14
15Differences Between Snit 2.1 and Snit 1.x
16--------------------------------------------------------------------
17
18V2.0 and V1.x are being developed in parallel.
19
20  Version 2.1 takes advantage of some new Tcl/Tk 8.5 commands
21  ([dict], [namespace ensemble], and [namespace upvar]) to improve 
22  Snit's run-time efficiency.  Otherwise, it's intended to be 
23  feature-equivalent with V1.x.  When running with Tcl/Tk 8.5, both 
24  V2.0 and V1.x are available; when running with Tcl/Tk 8.3 or Tcl/Tk 
25  8.4, only V1.x is available.
26
27  Snit 1.x is implemented in snit.tcl; Snit 2.1 in snit2.tcl.
28
29V2.1 includes the following enhancements over V1.x:
30
31* A type's code (methods, type methods, etc.) can now call commands
32  from the type's parent namespace without qualifying or importing
33  them, i.e., type ::parentns::mytype's code can call
34  ::parentns::someproc as just "someproc".
35
36  This is extremely useful when a type is defined as part of a larger
37  package, and shares a parent namespace with the rest of the package;
38  it means that the type can call other commands defined by the
39  package without any extra work.
40
41  This feature depends on the new Tcl 8.5 [namespace path] command,
42  which is why it hasn't been implemented for V1.x.  V1.x code can
43  achieve something similar by placing
44
45    namespace import [namespace parent]::*
46
47  in a type constructor.  This is less useful, however, as it picks up
48  only those commands which have already been exported by the parent
49  namespace at the time the type is defined.
50
51There are four incompatibilities between V2.1 and V1.x:
52
53* Implicit naming of objects now only works if you set 
54    
55    pragma -hastypemethods 0
56
57  in the type definition.  Otherwise, 
58
59    set obj [mytype]
60
61  will fail; you must use 
62
63    set obj [mytype %AUTO%]
64
65* In Snit 1.x and earlier, hierarchical methods and type methods
66  could be called in two ways:
67
68    snit::type mytype {
69        method {foo bar} {} { puts "Foobar!"}
70    }  
71
72    set obj [mytype %AUTO%]
73    $obj foo bar     ;# This is the first way
74    $obj {foo bar}   ;# This is the second way
75
76  In Snit 2.1, the second way no longer works.
77
78* In Snit 1.x and earlier, [$obj info methods] and 
79  [$obj info typemethods] returned a complete list of all known
80  hierarchical methods.  In the example just above, for example,
81  the list returned by [$obj info methods] would include 
82  "foo bar".  In Snit 2.1, only the first word of a hierarchical
83  method name is returned, [$obj info methods] would include 
84  "foo" but not "foo bar".
85
86* Because a type's code (methods, type methods, etc.) can now 
87  call commands from the type's parent namespace without qualifying 
88  or importing them, this means that all commands defined in the
89  parent namespace are visible--and can shadow commands defined
90  in the global namespace, including the standard Tcl commands.
91  There was a case in Tcllib where the Snit type ::tie::std::file
92  contained a bug with Snit 2.1 because the type's own name
93  shadowed the standard [file] command in the type's own code.
94
95
96Changes in V1.2
97--------------------------------------------------------------------
98
99* Defined a family of validation types.  Validation types are used
100  to validate data values; for example, snit::integer and its
101  subtypes can validate a variety of classes of integer value, e.g.,
102  integers between 3 and 9 or integers greater than 0.
103
104Changes in V1.1
105--------------------------------------------------------------------
106
107* It's now explicitly an error to call an object's "destroy" method
108  in the object's constructor.  (If you need to do it, just throw
109  an error; construction will fail and the object will be cleaned
110  up.
111
112* The Tile "ttk::frame" widget is now a valid hulltype for 
113  snit::widgets.  Any widget with a -class option can be used
114  as a hulltype; lappend the widget name to
115  snit::hulltypes to enable its use as a hulltype.
116
117* The TK labelframe widget and the Tile ttk::labelframe widget are
118  now valid hulltypes for snit::widgets.
119
120Changes in V1.0
121--------------------------------------------------------------------
122
123Functionally, V1.0 is identical to version V0.97.
124
125* Added a number of speed optimizations provided by Jeff Hobbs.
126  (Thanks, Jeff!)
127
128* Returned to the name "Snit's Not Incr Tcl".
129
130* Fixed SourceForge Tcllib Bug 1161779; it's no longer an error
131  if the destructor is defined before the constructor.
132
133* Fixed SourceForge Tcllib Bug 1106375; the hull widget is now
134  destroyed properly if there's an error in the constructor of 
135  a widget or widgetadaptor.
136
137Changes in V0.97
138--------------------------------------------------------------------
139
140The changes listed here were actually made over time in Snit V0.96;
141now that they are complete, the result has been renumbered Snit V0.97.
142
143* Bug fix: methods called via [mymethod] can now return exotic
144  return codes (e.g., "return -code break").
145
146* Added the -hasinfo pragma, which controls whether there's an
147  "info" instance method or not.  By default, there is.
148
149* POSSIBLE INCOMPATIBILITY: If no options are defined for a type, neither
150  locally nor delegated, then Snit will not define the "configure", 
151  "configurelist", and "cget" instance methods or the "options" 
152  instance variable.
153
154* If a snit::type's command is called without arguments, AND the type 
155  can have instances, then an instance is created using %AUTO% to 
156  create its name.  E.g., the following commands are all equivalent:
157
158    snit::type dog { ... }
159
160    set mydog [dog create %AUTO%]
161    set mydog [dog %AUTO%]
162    set mydog [dog]
163
164  This doesn't work for widgets, for obvious reasons.
165
166* Added pragma -hastypemethods.  If its value is "yes" (the
167  default), then the type has traditional Snit behavior with
168  respect to typemethods.  If its value is "no", then the type
169  has no typemethods (even if typemethods were included 
170  explicitly in the type definition).  Instead, the first argument
171  of the type proc is the name of the object to create.  As above,
172  the first argument defaults to "%AUTO%" for snit::types but not
173  for snit::widgets.
174
175* Added pragma -simpledispatch.  This pragma is intended to make
176  simple, heavily used types (e.g. stacks or queues) more efficient.
177  If its value is "no" (the default), then the type has traditional
178  Snit behavior with respect to method dispatch.  If its value is
179  "yes", then a simpler, faster scheme is used; however, there are
180  corresponding limitations. See the man page for details.
181
182* Bug fix: the "pragma" statement now throws an error if the specified 
183  pragma isn't defined, e.g., "pragma -boguspragma yes" is now an
184  error.
185
186* Bug fix: -readonly options weren't.  Now they are.
187
188* Added support for hierarchical methods, like the Tk text widget's
189  tag, mark, and image methods.  You define the methods like so:
190
191    method {tag add}       {args} {...}
192    method {tag configure} {args} {...}
193    method {tag cget}      {args} {...}
194
195  and call them like so:
196
197    $widget tag add ....
198
199  The "delegate method" statement also supports hierarchical methods.
200  However, hierarchical methods cannot be used with -simpledispatch.
201
202* Similarly, added support for hierarchical typemethods.
203
204Changes in V0.96
205--------------------------------------------------------------------
206
207V0.96 was the development version in which most of the V0.97 changes
208were implemented.  The name was changed to V0.97 when the changes
209were complete, so that the contents of V0.97 will be stable.
210
211Changes in V0.95
212--------------------------------------------------------------------
213
214The changes listed here were actually made over time in Snit V0.94;
215now that they are complete, the result has been renumbered Snit V0.95.
216
217* Snit method invocation (both local and delegated) has been 
218  optimized by the addition of a "method cache".  The primary
219  remaining cost in method invocation is the cost of declaring
220  instance variables.
221
222* Snit typemethod invocation now also uses a cache.
223
224* Added the "myproc" command, which parallels "mymethod".  "codename"
225  is now deprecated.
226
227* Added the "mytypemethod" command, which parallels "mymethod".
228
229* Added the "myvar" and "mytypevar" commands.  "varname" is now
230  deprecated.
231
232* Added ::snit::macro.
233
234* Added the "component" type definition statement.  This replaces
235  "variable" for declaring components explicitly, and has two nifty 
236  options, "-public" and "-inherit".
237
238* Reimplemented the "delegate method" and "delegate option"
239  statements; among other things, they now have more descriptive error
240  messages.
241
242* Added the "using" clause to the "delegate method" statement.  The
243  "using" clause allows the programmer to specify an arbitrary command
244  prefix into which the component and method names (among other
245  things) can be automatically substituted.  It's now possible to
246  delegate a method just about any way you'd like.
247
248* Added ::snit::compile.
249
250* Added the "delegate typemethod" statement.  It's similar to 
251  "delegate method" and has the same syntax, but delegates typemethods
252  to commands whose names are stored in typevariables.
253
254* Added the "typecomponent" type definition statement.  Parallel to
255  "component", "typecomponent" is used to declare targets for the new 
256  "delegate typemethod" statement.
257
258* "delegate method" can now delegate methods to components or
259  typecomponents.
260
261* The option definition syntax has been extended; see snit.man.  You
262  can now define methods to handle cget or configure of any option; as
263  a result, The "oncget" and "onconfigure" statements are now deprecated.
264  Existing "oncget" and "onconfigure" handlers continue to function as
265  expected, with one difference: they get a new implicit argument,
266  "_option", which is the name of the option being set.  If your
267  existing handlers use "_option" as a variable name, they will need
268  to be changed.
269
270* In addition, the "option" statement also allows you to define a
271  validation method.  If defined, it will be called before the value
272  is saved; its job is to validate the option value and call "error"
273  if there's a problem.
274
275* In addition, options can be defined to be "-readonly".  A readonly
276  option's value can be set at creation time (i.e., in the type's
277  constructor) but not afterwards.
278
279* There's a new type definition statement called "pragma" that 
280  allows you to control how Snit generates the type from the
281  definition.  For example, you can disable all standard typemethods
282  (including "create"); this allows you to use snit::type to define
283  an ensemble command (like "string" or "file") using typevariables
284  and typemethods.
285
286* In the past, you could create an instance of a snit::type with the 
287  same name as an existing command; for example, you could create an
288  instance called "::info" or "::set".  This is no longer allowed, as
289  it can lead to errors that are hard to debug.  You can recover the
290  old behavior using the "-canreplace" pragma.
291
292* In type and widget definitions, the "variable" and "typevariable"
293  statements can now initialize arrays as well as scalars.
294
295* Added new introspection commands "$type info typemethods",
296  "$self info methods", and "$self info typemethods".
297
298* Sundry other internal changes.
299
300Changes in V0.94
301--------------------------------------------------------------------
302
303V0.94 was the development version in which most of the V0.95 changes
304were implemented.  The name was changed to V0.95 when the changes
305were complete, so that the contents of V0.95 will be stable.
306
307Changes in V0.93
308--------------------------------------------------------------------
309
310* Enhancement: Added the snit::typemethod and snit::method commands; 
311  these allow typemethods and methods to be defined (and redefined)
312  after the class already exists.  See the Snit man page for 
313  details.
314
315* Documentation fixes: a number of minor corrections were made to the
316  Snit man page and FAQ.  Thanks to everyone who pointed them out,
317  especially David S. Cargo.
318
319* Bug fix: when using %AUTO% to create object names, the counter 
320  will wrap around to 0 after it reaches (2^32 - 1), to prevent 
321  integer overflow errors. (Credit Marty Backe)
322
323* Bug fix: in a normal Tcl proc, the command
324
325    variable ::my::namespace::var
326
327  makes variable "::my::namespace::var" available to the proc under the 
328  local name "var".  Snit redefines the "variable" command for use in
329  instance methods, and had lost this behavior.  (Credit Jeff
330  Hobbs)
331
332* Bug fix: in some cases, the "info vars" instance method didn't
333  include the "options" instance variable in its output.
334
335* Fixed bug: in some cases the type command was created even if there 
336  was an error defining the type.  The type command is now cleaned 
337  up in these cases.  (Credit Andy Goth)
338
339
340Changes in V0.92
341--------------------------------------------------------------------
342
343* Bug fix: In type methods, constructors, and methods, the "errorCode"
344  of a thrown error was not propagated properly; no matter what it was
345  set to, it always emerged as "NONE".
346
347Changes in V0.91
348--------------------------------------------------------------------
349
350* Bug fix: On a system with both 0.9 and 0.81 installed, 
351  "package require snit 0.9" would get snit 0.81.  Here's why: to me
352  it was clear enough that 0.9 is later than 0.81, but to Tcl the 
353  minor version number 9 is less than minor version number 81.
354  From now on, all pre-1.0 Snit version numbers will have two
355  digits.
356
357* Bug fix: If a method or typemethod had an argument list which was
358  broken onto multiple lines, the type definition would fail. It now
359  works as expected.
360
361* Added the "expose" statement; this allows you to expose an entire
362  component as part of your type's public interface.  See the man page
363  and the Snit FAQ list for more information.
364
365* The "info" type and instance methods now take "string match"
366  patterns as appropriate.
367
368Changes in V0.9
369--------------------------------------------------------------------
370
371For specific changes, please see the file ChangeLog in this directory.
372Here are the highlights:
373
374* Snit widgets and widget adaptors now support the Tk option database.
375
376* It's possible set the hull type of a Snit widget to be either a
377  frame or a toplevel.
378
379* It's possible to explicitly set the widget class of a Snit widget.
380
381* It's possible to explicitly set the resource and class names for
382  all locally defined and explicitly delegated options.
383
384* Option and method names can be excluded from "delegate option *" by
385  using the "except" clause, e.g.,
386
387     delegate option * to hull except {-borderwidth -background}
388
389* Any Snit type or widget can define a "type constructor": a body of
390  code that's executed when the type is defined.  The type constructor
391  is typically used to initialize array-valued type variables, and to
392  add values to the Tk option database.
393
394* Components should generally be created and installed using the new
395  "install" command.
396
397* snit::widgetadaptor hulls should generally be created and installed
398  using the new "installhull using" form of the "installhull" command.
399
400See the Snit man page and FAQ list for more information on these new 
401features.
402
403
404Changes in V0.81
405--------------------------------------------------------------------
406
407* All documentation errors people e-mailed to me have been fixed.
408
409* Bug fix: weird type names.  In Snit 0.8, type names like
410  "hyphenated-name" didn't work because the type name is used as a
411  namespace name, and Tcl won't parse "-" as part of a namespace name
412  unless you quote it somehow.  Kudos to Michael Cleverly who both
413  noticed the problem and contributed the patch.
414
415* Bug fix: Tcl 8.4.2 incompatibility.  There was a bug in Tcl 8.4.1
416  (and in earlier versions, likely) that if the Tcl command "catch"
417  evaluated a block that contained an explicit "return", "catch" 
418  returned 0.  The documentation evidently indicated that it should
419  return 2, and so this was fixed in Tcl 8.4.2.  This broke a bit
420  of code in Snit.
421
422Changes in V0.8
423--------------------------------------------------------------------
424
425* Note that there are many incompatibilities between Snit V0.8 and
426  earlier versions; they are all included in this list.
427
428* Bug fix: In Snit 0.71 and Snit 0.72, if two instances of a
429  snit::type are created with the same name, the first instance's
430  private data is not destroyed.  Hence, [$type info instances] will
431  report that the first instance still exists.  This is now fixed.
432
433* Snit now requires Tcl 8.4, as it depends on the new command
434  tracing facility.
435
436* The snit::widgettype command, which was previously deprecated, has
437  now been deleted.
438
439* The snit::widget command has been renamed snit::widgetadaptor; its
440  usage is unchanged, except that the idiom "component hull is ..." 
441  is no longer used to define the hull component.  Instead, use the
442  "installhull" command:
443
444        constructor {args} {
445            installhull [label $win ...]
446            $self configurelist $args
447        }
448
449* The "component" command is now obsolete, and has been removed.
450  Instead, the "delegate" command implicitly defines an instance
451  variable for the named component; the constructor should assign an
452  object name to that instance variable.  For example, whereas you
453  used to write this: 
454
455    snit::type dog {
456        delegate method wag to tail
457
458        constructor {args} {
459            component tail is [tail $self.tail -partof self]
460        }
461
462        method gettail {} {
463            return [component tail]
464        }
465    }
466
467  you now write this:
468
469    snit::type dog {
470        delegate method wag to tail
471
472        constructor {args} {
473            set tail [tail $self.tail -partof self]
474        }
475
476        method gettail {} {
477            return $tail
478        }
479    }
480
481* There is a new snit::widget command; unlike snit::widgetadaptor,
482  snit::widget automatically creates a Tk frame widget as the hull
483  widget; the constructor doesn't need to create and set a hull component.
484
485* Snit objects may now be renamed without breaking; many of the
486  specific changes which follow are related to this.  However,
487  there are some new practices for type authors to follow if they wish
488  to write renameable types and widgets.  In particular,
489
490  * In an instance method, $self will always contain the object's
491    current name, so instance methods can go on calling other instance
492    methods using $self.
493
494  * If the object is renamed, then $self's value will change.  Therefore, 
495    don't use $self for anything that will break if $self changes.
496    For example, don't pass a callback as "[list $self methodname]".
497
498  * If the object passes "[list $self methodname arg1 arg2]" as a callback, 
499    the callback will fail when the object is renamed.  Instead, the 
500    object should pass "[mymethod methodname arg1 arg2]".  The [mymethod]
501    command returns the desired command as a list beginning with a
502    name for the object that never changes.
503
504    For example, in Snit V0.71 you might have used this code to call a
505    method when a Tk button is pushed: 
506
507     .btn configure -command [list $self buttonpress]
508
509    This still works in V0.8--but the callback will break if your
510    instance is renamed.  Here's the safe way to do it:
511
512     .btn configure -command [mymethod buttonpress]
513
514  * Every object has a private namespace; the name of this namespace
515    is now available in method bodies, etc., as "$selfns".  This value is
516    constant for the life the object.  Use "$selfns" instead of "$self" if
517    you need a unique token to identify the object.
518
519  * When a snit::widget's instance command is renamed, its Tk window
520    name remains the same--and is still extremely important.
521    Consequently, the Tk window name is now available in snit::widget
522    method bodies, etc., as "$win".  This value is constant for the
523    life of the object.  When creating child windows, it's best to 
524    use "$win.child" rather than "$self.child" as the name of the
525    child window. 
526
527* The names "selfns" and "win" may no longer be used as explicit argument
528  names for typemethods, methods, constructors, or onconfigure
529  handlers.
530
531* procs defined in a Snit type or widget definition used to be able to
532  reference instance variables if "$self" was passed to them
533  explicitly as the argument "self"; this is no longer the case.
534
535* procs defined in a Snit type or widget definition can now reference
536  instance variables if "$selfns" is passed to them explicitly as the
537  argument "selfns".  However, this usage is deprecated.
538
539* All Snit type and widget instances can be destroyed by renaming the
540  instance command to "".
541
542Changes in V0.72
543--------------------------------------------------------------------
544
545* Updated the pkgIndex.tcl file to references snit 0.72 instead of
546  snit 0.7.
547
548* Fixed a bug in widget destruction that caused errors like
549  "can't rename "::hull1.f": command doesn't exist".
550
551Changes in V0.71
552--------------------------------------------------------------------
553
554* KNOWN BUG: The V0.7 documentation implies that a snit::widget can
555  serve as the hull of another snit::widget.  Unfortunately, it
556  doesn't work.  The fix for this turns out to be extremely
557  complicated, so I plan to fix it in Snit V0.8.
558
559  Note that a snit::widget can still be composed of other
560  snit::widgets;  it's only a problem when the hull component in
561  particular is a snit::widget.
562
563* KNOWN BUG: If you rename a Snit type or instance command (i.e., using
564  Tcl's [rename] command) it will no longer work properly.  This is
565  part of the reason for the previous bug, and should also be fixed in
566  Snit V0.8.
567
568* Enhancement: Snit now preserves the call stack (i.e., the
569  "errorInfo") when rethrowing errors thrown by Snit methods,
570  typemethods, and so forth.  This should make debugging Snit types
571  and widgets much easier.  In Snit V0.8, I hope to clean up the
572  call stack so that Snit internals are hidden.
573
574* Bug fix: Option default values were being processed incorrectly.  In
575  particular, if the default value contained brackets, it was treated
576  as a command interpolation.  For example,
577
578    option -regexp {[a-z]+}
579
580  yield the error that "a-z" isn't a known command.  Credit to Keith
581  Waclena for finding this one.
582
583* Bug fix: the [$type info instances] command failed to find
584  instances that weren't defined in the global namespace, and found
585  some things that weren't instances.  Credit to Keith Waclena for
586  finding this one as well.
587
588* Internal Change: the naming convention for instance namespaces
589  within the type namespace has changed.  But then, your code
590  shouldn't have depended on that anyway.
591
592* Bug fix: snit::widget destruction was seriously broken if the hull
593  component was itself a megawidget (e.g., a BWidget).
594  Each layer of megawidget code needs its opportunity
595  to clean up properly, and that wasn't happening.  In addition, the
596  snit::widget destruction code was bound as follows:
597
598    bind $widgetName <Destroy> {....}
599
600  which means that if the user of a Snit widget needs to bind to
601  <Destroy> on the widget name they've just wiped out Snit's
602  destructor.  Consequently, Snit now creates a bindtag called
603  
604    Snit<widgettype>
605
606  e.g.,
607
608    Snit::rotext
609
610  and binds its destroy handler to that.  This bindtag is inserted in
611  the snit::widget's bindtags immediately after the widget name.
612
613  Destruction is always going to be somewhat tricky when multiple
614  levels of megawidgets are involved, as you need to make sure that
615  the destructors are called in inverse order of creation.
616
617Changes in V0.7
618----------------------------------------------------------------------
619
620* INCOMPATIBILITY: Snit constructor definitions can now have arbitrary
621  argument lists, as methods do.  That is, the type's create method 
622  expects the instance name followed by exactly the arguments defined
623  in the constructor's argument list: 
624
625    snit::type dog {
626        variable data
627        constructor {breed color} {
628            set data(breed) $breed
629            set data(color) $color
630        }
631    }
632
633    dog spot labrador chocolate
634
635  To get the V0.6 behavior, use the argument "args".  That is, the
636  default constructor would be defined in this way:
637
638    snit::type dog {
639        constructor {args} {
640            $self configurelist $args
641        }
642    }
643
644* Added a "$type destroy" type method.  It destroys all instances of
645  the type properly (if possible) then deletes the type's namespace
646  and type command.
647
648Changes in V0.6
649-----------------------------------------------------------------
650
651* Minor corrections to the man page.
652
653* The command snit::widgettype is deprecated, in favor of
654  snit::widget.
655
656* The variable "type" is now automatically defined in all methods,
657  constructors, destructors, typemethods, onconfigure handlers, and
658  oncget handlers.  Thus, a method can call type methods as "$type
659  methodname".
660
661* The new standard instance method "info" is used for introspection on 
662  type and widget instances:
663
664  $object info type
665     Returns the object's type.
666
667  $object info vars
668     Returns a list of the object's instance variables (excluding Snit
669     internal variables).  The names are fully qualified.
670
671  $object info typevars
672     Returns a list of the object's type's type variables (excluding
673     Snit internal variables).  The names are fully qualified.
674
675  $object info options
676     Returns a list of the object's option names.  This always
677     includes local options and explicitly delegated options.  If
678     unknown options are delegated as well, and if the component to
679     which they are delegated responds to "$object configure" like Tk
680     widgets do, then the result will include all possible unknown
681     options which could be delegated to the component.  
682
683     Note that the return value might be different for different
684     instances of the same type, if component object types can vary
685     from one instance to another.
686
687* The new standard typemethod "info" is used for introspection on
688  types:
689
690  $type info typevars
691     Returns a list of the type's type variables (excluding Snit
692     internal variables).
693
694  $type info instances
695     Returns a list of the instances of the type.  For non-widget
696     types, each instance will be the fully-qualified instance command
697     name; for widget types, each instance will be a widget name.
698
699* Bug fixed: great confusion resulted if the hull component of a
700  snit::widgettype was another snit::widgettype.  Snit takes over the
701  hull widget's Tk widget command by renaming it to a known name, and
702  putting its own command in its place.  The code made no allowance
703  for the fact that this might happen more than once; the second time,
704  the original Tk widget command would be lost.  Snit now ensures that
705  the renamed widget command is given a unique name.
706
707* Previously, instance methods could call typemethods by name, as
708  though they were normal procs.  The downside to this was that
709  if a typemethod name was the same as a standard Tcl command, the
710  typemethod shadowed the standard command in all of the object's
711  code.  This is extremely annoying should you wish to define a
712  typemethod called "set".  Instance methods must now call typemethods
713  using the type's command, as in "$type methodname".
714
715* Typevariable declarations are no longer required in
716  typemethods, methods, or procs provided that the typevariables are defined
717  in the main type or widget definition.
718
719* Instance variable declarations are no longer required in methods provided
720  that the instance variables are defined in the main type or widget
721  declaration.
722
723* Instance variable declarations are no longer required in procs,
724  provided that the instance variables are defined in the main type or
725  widget declaration.  Any proc that includes "self" in its argument
726  list will pick up all such instance variables automatically.
727
728* The "configure" method now returns output consistent with Tk's when
729  called with 0 or 1 arguments, i.e., it returns information about one
730  or all options.  For options defined by Snit objects, the "dbname"
731  and "classname" returned in the output will be {}.  "configure" does
732  its best to do the right thing in the face of delegation.
733
734* If the string "%AUTO%" appears in the "name" argument to "$type create"
735  or "$widgettype create", it will be replaced with a string that
736  looks like "$type$n", where "$type" is the type name and "$n" is 
737  a counter that's incremented each time a
738  widget of this type is created.  This allows the caller to create 
739  effectively anonymous instances:
740
741  widget mylabel {...}
742
743  set w [mylabel .pane.toolbar.%AUTO% ...]
744  $w configure -text "Some text"
745
746* The "create" typemethod is now optional for ordinary types so long
747  as the desired instance name is different than any typemethod name
748  for that type.  Thus, the following code creates two dogs, ::spot
749  and ::fido.
750
751  type dog {...}
752
753  dog create spot
754  dog fido
755
756  If there's a conflict between the instance name and a typemethod, 
757  either use "create" explicitly, or fully qualify the instance name:
758
759  dog info -color black           ;# Error; assumes "info" typemethod.
760  dog create info -color black    ;# OK
761  dog ::info -color black         ;# also OK
762
763* Bug fix: If any Snit method, typemethod, constructor, or onconfigure
764  handler defines an explicit argument called "type" or "self", the type
765  definition now throws an error, preventing confusing runtime
766  behavior.
767
768* Bug fix: If a Snit type or widget definition attempts to define a
769  method or option locally and also delegate it to a component, the 
770  type definition now throws an error, preventing confusing runtime 
771  behavior.
772
773* Bug(?) Fix: Previously, the "$self" command couldn't be used in
774  snit::widget constructors until after the hull component was
775  defined.  It is now possible to use the "$self" command to call
776  instance methods at any point in the snit::widget's
777  constructor--always bearing in mind that it's an error to configure
778  delegated options or are call delegated methods before creating the
779  component to which they are delegated.
780
781Changes in V0.5
782------------------------------------------------------------------
783
784* Updated the test suite so that Tk-related tests are only run if
785  Tk is available.  Credit Jose Nazario for pointing out the problem.
786
787* For snit::widgettypes, the "create" keyword is now optional when 
788  creating a new instance.  That is, either of the following will
789  work:
790
791  ::snit::widgettype mylabel { }
792
793  mylabel create .lab1 -text "Using create typemethod"
794  mylabel .lab2 -text "Implied create typemethod"
795
796  This means that snit::widgettypes can be used identically to normal
797  Tk widgets.  Credit goes to Colin McCormack for suggesting this.
798
799* Destruction code is now defined using the "destructor" keyword
800  instead of by defining a "destroy" method.  If you've been 
801  defining the "destroy" method, you need to replace it with 
802  "destructor" immediately.  See the man page for the syntax.
803
804* widgettype destruction is now handled properly (it was buggy).  
805  Use the Tk command "destroy" to destroy instances of a widgettype;
806  the "destroy" method isn't automatically defined for widgettypes as
807  it is for normal types, and has no special significance even if it
808  is defined.
809
810* Added the "from" command to aid in parsing out specific option
811  values in constructors.
812
813Changes in V0.4
814------------------------------------------------------------------
815
816* Added the "codename" command, to qualify type method and private
817  proc names.
818
819* Changed the internal implementation of Snit types and widget types
820  to prevent an obscure kind of error and to make it easier to pass
821  private procs as callback commands to other objects.  Credit to Rolf
822  Ade for discovering the hole.
823
824Changes in V0.3
825------------------------------------------------------------------
826
827* First public release.
828
829
830