Updated 2018-06-03 18:58:01 by dbohdan

Name: validProc

Description: Determines if a procedure is valid in the context within which it is called. Just allows a clean test for usability.

Parameters: name - a proc name or wildcard in any number of forms:
  1. foo - a plain proc name in ANY child namespace
  2. ::foo* - all procs in the namespace foo
  3. ::foo::* - same
  4. ::foo::valid* - all procs named like this one

Usage:
       if { ! [ validProc "procname" ] } { complain }

Comments: Best made use of in the negated sense as shown above.
proc validProc { { name * } } {
     set namesp [ namespace children ]
    
     ;## if the argument was namespace aware
     if { [ regexp {::} $name ] } {
         set namesp {}
     }
    
     ;## if the arg was of the form ::foo*
     if { [ regexp {^(::[^:]+)\*} $name -> tmp ] } {
         set name ${tmp}::*
     }
    
     ;## examine all namespaces visible locally
     foreach ns $namesp {
        if { ! [ regexp {::$} $ns ] } {
            ns ${ns}::
        }
        if { [ llength [ info commands $ns$name ] ] } {
            return 1
        }
     }
    
     ;## if the argument was a non-namespace proc
     if { [ llength [ info commands $name ] ] } {
         return 1
     }
     return 0
}

--Phil Ehrens