
proc ?set {v_name val} {
 upvar $v_name v
 if {![info exists v]} {
  return -code error "error: variable $v_name doesn't exist."
 }
 set v $val
}

proc get.unique.command.name {} {
 while 1 {
  if {"" eq [info commands [set n cmd[clock clicks]]]} {
   return $n
  }
 }
}

# N E W

set ::_current_class ""

proc class name {
 #puts NAME:$name
 ?set ::_current_class $name
}

proc dispatch {class obj argList} {
 foreach {sel arg} $argList {
  #puts "INVOKE $sel : $arg"
  _${class}_${sel} $obj $arg
 }
}

proc endclass {} {
 proc $::_current_class {} {
  set class [lindex [info level 0] 0]
  set obj [get.unique.command.name]
  proc $obj args "dispatch $class $obj \$args"
  return $obj
 }
 ?set ::_current_class ""
}

proc method {name body} {
 proc _[set ::_current_class]_$name {self msg} $body
 #puts [info procs]
}


class Funzo
 method -fust {
  puts "FUST $msg"
 } 

 method -text {
  puts "oh, if I were a text item, I'd display $msg"
 }
endclass

proc main {} {
 set f [Funzo]

 $f -fust Hello -text "Hello World"
}
main