# ---------------------------------------------------------------------- # PURPOSE: Clear all class data and reload a class definition # # AUTHOR: Michael J. McLennan Phone: (610)712-2842 # AT&T Bell Laboratories E-mail: michael.mclennan@att.com # # RCS: itcl_reload.tcl,v 1.1.1.1 1994/03/21 22:09:46 mmc Exp # ---------------------------------------------------------------------- # Copyright (c) 1993 AT&T Bell Laboratories # ====================================================================== # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies and that # both that the copyright notice and warranty disclaimer appear in # supporting documentation, and that the names of AT&T Bell Laboratories # any of their entities not be used in advertising or publicity # pertaining to distribution of the software without specific, written # prior permission. # # AT&T disclaims all warranties with regard to this software, including # all implied warranties of merchantability and fitness. In no event # shall AT&T be liable for any special, indirect or consequential # damages or any damages whatsoever resulting from loss of use, data or # profits, whether in an action of contract, negligence or other # tortuous action, arising out of or in connection with the use or # performance of this software. # ====================================================================== # ---------------------------------------------------------------------- # USAGE: itcl_unload ... # # Destroys all objects in the specified classes, and destroys the # class definitions. Also destroys all objects and class definitions # that inherit from the specified classes. # ---------------------------------------------------------------------- proc itcl_unload {args} { foreach class [eval itcl_dependencies $args] { foreach o [itcl_info objects -class $class] { $o delete } rename $class {} } foreach class $args { foreach o [itcl_info objects -class $class] { $o delete } rename $class {} } } # ---------------------------------------------------------------------- # USAGE: itcl_reload ... # # Destroys all objects in the specified classes, and all objects # that inherit from the specified classes. Destroys and re-loads # the specified classes and any other classes that inherit from # the specified classes. Useful during debugging to avoid having # to restart the program to recognize source changes. # ---------------------------------------------------------------------- proc itcl_reload {args} { eval itcl_unload $args # # Reload specified classes and dependent classes. # NOTE: Autoloading of class definitions is forced # by invoking the class name with no arguments. # foreach class $args { $class } foreach class [eval itcl_dependencies $args] { $class } } # ---------------------------------------------------------------------- # USAGE: itcl_dependencies ... # # Returns a list of classes that have the specified classes in their # inheritance hierarchy. Each element in the return list will be # a unique class name. Used in "itcl_unload" and "itcl_reload" to # unload and reload derived classes whenever the base classes change. # ---------------------------------------------------------------------- proc itcl_dependencies {args} { set depends(x) make-this-an-array unset depends(x) set classes [itcl_info classes] foreach class $args { foreach dclass $classes { if {$dclass != $class} { set hier [$dclass :: info heritage] if {[lsearch $hier $class] >= 0} { set depends($dclass) $class } } } } return [array names depends] } .