The page [Persistent incr-Tcl objects] got me thinking about persistence. Here's a function which constructs a script which, when evaluated in global scope, will do what I think I want: # serialize extracts all variables and their current values into a script # such that `eval [serialize obj]' will set obj to those values proc serialize {obj} { set result "" foreach var [$obj info variable] { foreach {type name} [$obj info variable $var -type -name] break if {([namespace tail $name] != "this") && ($type != "common")} { set name "@itcl $obj $name" if {[catch { append result "set \"${name}\" [string toupper [set $name]]\n" } err]} { puts stderr "err: $err" } } } return $result } Here's a small test: class test_persist { common com com_val private variable priv priv_val public variable pub pub_val protected variable prot prot_val constructor {} { set priv priv_v set pub pub_v set prot prot_v } } class test_p1 { inherit test_persist public variable sub_pub sub_pub private variable sub_priv sub_priv method test {} { foreach var [$this info variable] { foreach {type name val} [$this info variable $var -type -name -value] break puts "$name = $val" } } constructor {} { # needs to be here } } test_p1 t puts "Vars: [t info variable]" set dump [serialize t] puts "DUMP: $dump" eval $dump puts [serialize t] t test [CMcC] ----