remove unknown handler

Updates command registration to provide top-level handlers for all
commands, rather than falling back onto the 'unknown' command. Instead,
that same handler is registered for placeholders, providing the same
functionality under the root verb command name instead.  This permits
users to implement their own 'unknown' function, and it resolves some
mind-bending breakage related to function object lookup while recursing.

Changes 'ocd_bounce' to call 'ocd_command' and 'ocd_help' from the
wrapper directly, rather than bouncing through their wrappers. This
prevents endless recursion caused by the above changes, whereby the
'command' wrapper's type check would blow the stack to hell and gone.
This commit is contained in:
Zachary T Welch
2009-11-27 21:47:54 -08:00
parent df22f0f9ca
commit 89fa493a3b
2 changed files with 40 additions and 38 deletions

View File

@@ -15,7 +15,7 @@ proc exit {} {
# to discard 'handler' command output,
proc ocd_bouncer {name args} {
set cmd [format "ocd_%s" $name]
set type [eval command type $cmd $args]
set type [eval ocd_command type $cmd $args]
if {$type == "native"} {
return [eval $cmd $args]
} else {if {$type == "simple"} {
@@ -25,7 +25,7 @@ proc ocd_bouncer {name args} {
set errmsg "Command handler execution failed"
}
} else {if {$type == "group"} {
catch {eval help $name $args}
catch {eval ocd_help $name $args}
set errmsg [format "%s: command requires more arguments" \
[concat $name " " $args]]
} else {