Index: generic/gentclAPI.decls =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -97,6 +97,11 @@ {-argName "variable" -required 1 -type tclobj} {-argName "value" -required 0 -type tclobj} } +xotclCmd setter XOTclSetterCmd { + {-argName "object" -required 1 -type object} + {-argName "methodName" -required 1} + {-argName "-per-object" -type switch} +} # # object methods # @@ -165,9 +170,6 @@ objectMethod residualargs XOTclOResidualargsMethod { {-argName "args" -type allargs} } -objectMethod setter XOTclOSetterMethod { - {-argName "name" -required 1} -} objectMethod uplevel XOTclOUplevelMethod { {-argName "args" -type allargs} } @@ -220,7 +222,6 @@ {-argName "-postcondition" -nrargs 1 -type tclobj} } classMethod forward XOTclCForwardMethod { - {-argName "-per-object" -type switch} {-argName "name" -required 1 -type tclobj} {-argName "-default" -nrargs 1 -type tclobj} {-argName "-earlybinding"} @@ -237,10 +238,6 @@ {-argName "name" -required 1 -type tclobj} {-argName "args" -type allargs} } -classMethod setter XOTclCSetterMethod { - {-argName "-per-object" -type switch} - {-argName "name" -required 1} -} # # check methods # Index: generic/predefined.h =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- generic/predefined.h (.../predefined.h) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ generic/predefined.h (.../predefined.h) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -37,10 +37,11 @@ "::xotcl::dispatch [self] ::xotcl::cmd::Object::object-method \\\n" "$name $arguments $body {*}$conditions}\n" "::xotcl::dispatch Class -objscope ::eval {\n" -".method object {args} {\n" -"set p [expr {[lsearch -regexp $args {^(method|alias|forward|setter)$}] + 1}]\n" -"set cmd [linsert $args $p \"-per-object\"]\n" -"return [{*}.$cmd]}\n" +".method object {what args} {\n" +"if {$what in [list \"alias\" \"forward\" \"method\" \"setter\"]} {\n" +"return [::xotcl::dispatch [self] ::xotcl::classes::xotcl2::Object::$what {*}$args]}\n" +"if {$what in [list \"info\"]} {\n" +"::xotcl2::objectInfo [lindex $args 0] [self] {*}[lrange $args 1 end]}}\n" ".method unknown {m args} {\n" "error \"Method '$m' unknown for [self].\\\n" "Consider '[self] create $m $args' instead of '[self] $m $args'\"}}\n" @@ -66,13 +67,22 @@ "Class protected object method __unknown {name} {}\n" "Object public method alias {-objscope:switch methodName cmd} {\n" "::xotcl::alias [self] $methodName \\\n" +"-per-object \\\n" "{*}[expr {${objscope} ? \"-objscope\" : \"\"}] \\\n" "$cmd}\n" "Class public method alias {-objscope:switch -per-object:switch methodName cmd} {\n" "::xotcl::alias [self] $methodName \\\n" "{*}[expr {${objscope} ? \"-objscope\" : \"\"}] \\\n" "{*}[expr {${per-object} ? \"-per-object\" : \"\"}] \\\n" "$cmd}\n" +"Object public method setter {methodName value:optional} {\n" +"if {[info exists value]} {\n" +"::xotcl::setter [self] $methodName -per-object $value} else {\n" +"::xotcl::setter [self] $methodName -per-object}}\n" +"Class public method setter {methodName value:optional} {\n" +"if {[info exists value]} {\n" +"::xotcl::setter [self] $methodName $value} else {\n" +"::xotcl::setter [self] $methodName}}\n" "Object create ::xotcl2::objectInfo\n" "Object create ::xotcl2::classInfo\n" "::xotcl::dispatch objectInfo -objscope ::eval {\n" @@ -101,8 +111,6 @@ "unset cmd\n" "Object forward info -onerror ::xotcl::infoError ::xotcl2::objectInfo %1 {%@2 %self}\n" "Class forward info -onerror ::xotcl::infoError ::xotcl2::classInfo %1 {%@2 %self}\n" -"::xotcl::dispatch ::xotcl2::classInfo ::xotcl::cmd::Object::forward \\\n" -"\"-per-object\" ::xotcl2::objectInfo {%@2 %1}\n" "proc ::xotcl::infoError msg {\n" "regsub -all \" \" $msg \"\" msg\n" "regsub -all \" \" $msg \"\" msg\n" @@ -230,9 +238,9 @@ "set .domain [::xotcl::self callingobject]}\n" "if {${.domain} ne \"\"} {\n" "${.domain} __invalidateobjectparameter\n" -"::xotcl::dispatch ${.domain} ::xotcl::cmd::Class::forward \\\n" -"{*}[expr {${.per-object} ? \"-per-object\" : \"\"}] ${.name} \\\n" -"${.manager} [list %1 [${.manager} defaultmethods]] %self \\\n" +"set cl [expr {${.per-object} ? \"Object\" : \"Class\"}]\n" +"::xotcl::dispatch ${.domain} ::xotcl::classes::xotcl2::${cl}::forward \\\n" +"${.name} ${.manager} [list %1 [${.manager} defaultmethods]] %self \\\n" "\"%-per-object [info exists .forward-per-object]\" \\\n" "%proc}}\n" "::xotcl::MetaSlot create ::xotcl::InfoSlot\n" @@ -353,7 +361,7 @@ "if {[set .defaultmethods] ne {get assign}} return\n" "if {[.info callable -which assign] ne \"::xotcl::Slot alias assign ::xotcl::setinstvar\"} return\n" "if {[.info callable -which get] ne \"::xotcl::Slot alias get ::xotcl::setinstvar\"} return\n" -"::xotcl::dispatch ${.domain} ::xotcl::cmd::Class::setter {*}[expr {${.per-object} ? \"-per-object\" : \"\"}] ${.name}}}\n" +"::xotcl::setter ${.domain} {*}[expr {${.per-object} ? \"-per-object\" : \"\"}] ${.name}}}\n" "::xotcl::Attribute mixin add ::xotcl::Slot::Optimizer\n" "::xotcl2::Class create ::xotcl::ScopedNew -superclass ::xotcl2::Class\n" "createBootstrapAttributeSlots ::xotcl::ScopedNew {\n" Index: generic/predefined.xotcl =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- generic/predefined.xotcl (.../predefined.xotcl) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -67,6 +67,8 @@ set conditions [list] if {[info exists precondition]} {lappend conditions -precondition $precondition} if {[info exists postcondition]} {lappend conditions -postcondition $postcondition} + #puts stderr [subst {::xotcl::dispatch [self] ::xotcl::cmd::Object::object-method \ + # $name $arguments $body {*}$conditions}] ::xotcl::dispatch [self] ::xotcl::cmd::Object::object-method \ $name $arguments $body {*}$conditions } @@ -75,10 +77,13 @@ ::xotcl::dispatch Class -objscope ::eval { # method-modifier for object specific methos - .method object {args} { - set p [expr {[lsearch -regexp $args {^(method|alias|forward|setter)$}] + 1}] - set cmd [linsert $args $p "-per-object"] - return [{*}.$cmd] + .method object {what args} { + if {$what in [list "alias" "forward" "method" "setter"]} { + return [::xotcl::dispatch [self] ::xotcl::classes::xotcl2::Object::$what {*}$args] + } + if {$what in [list "info"]} { + ::xotcl2::objectInfo [lindex $args 0] [self] {*}[lrange $args 1 end] + } } # define unknown handler for class @@ -143,6 +148,7 @@ Object public method alias {-objscope:switch methodName cmd} { ::xotcl::alias [self] $methodName \ + -per-object \ {*}[expr {${objscope} ? "-objscope" : ""}] \ $cmd } @@ -153,7 +159,23 @@ {*}[expr {${per-object} ? "-per-object" : ""}] \ $cmd } + + Object public method setter {methodName value:optional} { + if {[info exists value]} { + ::xotcl::setter [self] $methodName -per-object $value + } else { + ::xotcl::setter [self] $methodName -per-object + } + } + Class public method setter {methodName value:optional} { + if {[info exists value]} { + ::xotcl::setter [self] $methodName $value + } else { + ::xotcl::setter [self] $methodName + } + } + ######################## # Info definition ######################## @@ -205,8 +227,8 @@ Object forward info -onerror ::xotcl::infoError ::xotcl2::objectInfo %1 {%@2 %self} Class forward info -onerror ::xotcl::infoError ::xotcl2::classInfo %1 {%@2 %self} - ::xotcl::dispatch ::xotcl2::classInfo ::xotcl::cmd::Object::forward \ - "-per-object" ::xotcl2::objectInfo {%@2 %1} +# ::xotcl::dispatch ::xotcl2::classInfo ::xotcl::cmd::Object::forward \ +# "-per-object" -verbose ::xotcl2::objectInfo {%@2 %1} proc ::xotcl::infoError msg { #puts stderr "INFO ERROR: <$msg>\n$::errorInfo" @@ -455,12 +477,11 @@ ${.domain} __invalidateobjectparameter # since the domain object might be xotcl1 or xotcl2, use dispatch - ::xotcl::dispatch ${.domain} ::xotcl::cmd::Class::forward \ - {*}[expr {${.per-object} ? "-per-object" : ""}] ${.name} \ - ${.manager} [list %1 [${.manager} defaultmethods]] %self \ + set cl [expr {${.per-object} ? "Object" : "Class"}] + ::xotcl::dispatch ${.domain} ::xotcl::classes::xotcl2::${cl}::forward \ + ${.name} ${.manager} [list %1 [${.manager} defaultmethods]] %self \ "%-per-object [info exists .forward-per-object]" \ %proc - } } @@ -668,7 +689,7 @@ if {[.info callable -which assign] ne "::xotcl::Slot alias assign ::xotcl::setinstvar"} return if {[.info callable -which get] ne "::xotcl::Slot alias get ::xotcl::setinstvar"} return #puts stderr "**** optimizing ${.domain} $forwarder ${.name}" - ::xotcl::dispatch ${.domain} ::xotcl::cmd::Class::setter {*}[expr {${.per-object} ? "-per-object" : ""}] ${.name} + ::xotcl::setter ${.domain} {*}[expr {${.per-object} ? "-per-object" : ""}] ${.name} } } # register the optimizer per default Index: generic/tclAPI.h =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- generic/tclAPI.h (.../tclAPI.h) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ generic/tclAPI.h (.../tclAPI.h) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -109,7 +109,6 @@ static int XOTclCMixinGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCNewMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCRecreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclCSetterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -160,7 +159,6 @@ static int XOTclONoinitMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclORequireNamespaceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOResidualargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclOSetterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOUplevelMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOUpvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOVolatileMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -183,21 +181,21 @@ static int XOTclQualifyObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclRelationCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclSetInstvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclSetterCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCheckBooleanArgs(Tcl_Interp *interp, char *name, Tcl_Obj *value); static int XOTclCheckRequiredArgs(Tcl_Interp *interp, char *name, Tcl_Obj *value); static int XOTclCAllocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name); static int XOTclCCreateMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, int objc, Tcl_Obj *CONST objv[]); static int XOTclCDeallocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *object); static int XOTclCFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, char *filter, Tcl_Obj *guard); -static int XOTclCForwardMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, Tcl_Obj *name, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]); +static int XOTclCForwardMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclCInvalidateObjectParameterMethod(Tcl_Interp *interp, XOTclClass *cl); static int XOTclCInvariantsMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *invariantlist); static int XOTclCMethodMethod(Tcl_Interp *interp, XOTclClass *cl, int withInner_namespace, int withPublic, Tcl_Obj *name, Tcl_Obj *args, Tcl_Obj *body, Tcl_Obj *withPrecondition, Tcl_Obj *withPostcondition); static int XOTclCMixinGuardMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, char *mixin, Tcl_Obj *guard); static int XOTclCNewMethod(Tcl_Interp *interp, XOTclClass *cl, XOTclObject *withChildof, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclCRecreateMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name, int objc, Tcl_Obj *CONST objv[]); -static int XOTclCSetterMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, char *name); static int XOTclClassInfoFilterMethod(Tcl_Interp *interp, XOTclClass *class, int withGuards, char *pattern); static int XOTclClassInfoFilterguardMethod(Tcl_Interp *interp, XOTclClass *class, char *filter); static int XOTclClassInfoForwardMethod(Tcl_Interp *interp, XOTclClass *class, int withDefinition, char *name); @@ -248,7 +246,6 @@ static int XOTclONoinitMethod(Tcl_Interp *interp, XOTclObject *obj); static int XOTclORequireNamespaceMethod(Tcl_Interp *interp, XOTclObject *obj); static int XOTclOResidualargsMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); -static int XOTclOSetterMethod(Tcl_Interp *interp, XOTclObject *obj, char *name); static int XOTclOUplevelMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); static int XOTclOUpvarMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); static int XOTclOVolatileMethod(Tcl_Interp *interp, XOTclObject *obj); @@ -271,6 +268,7 @@ static int XOTclQualifyObjCmd(Tcl_Interp *interp, Tcl_Obj *name); static int XOTclRelationCmd(Tcl_Interp *interp, XOTclObject *object, int withPer_object, int relationtype, Tcl_Obj *value); static int XOTclSetInstvarCmd(Tcl_Interp *interp, XOTclObject *object, Tcl_Obj *variable, Tcl_Obj *value); +static int XOTclSetterCmd(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withPer_object); enum { XOTclCheckBooleanArgsIdx, @@ -286,7 +284,6 @@ XOTclCMixinGuardMethodIdx, XOTclCNewMethodIdx, XOTclCRecreateMethodIdx, - XOTclCSetterMethodIdx, XOTclClassInfoFilterMethodIdx, XOTclClassInfoFilterguardMethodIdx, XOTclClassInfoForwardMethodIdx, @@ -337,7 +334,6 @@ XOTclONoinitMethodIdx, XOTclORequireNamespaceMethodIdx, XOTclOResidualargsMethodIdx, - XOTclOSetterMethodIdx, XOTclOUplevelMethodIdx, XOTclOUpvarMethodIdx, XOTclOVolatileMethodIdx, @@ -359,7 +355,8 @@ XOTclNSCopyVarsIdx, XOTclQualifyObjCmdIdx, XOTclRelationCmdIdx, - XOTclSetInstvarCmdIdx + XOTclSetInstvarCmdIdx, + XOTclSetterCmdIdx } XOTclMethods; @@ -490,18 +487,17 @@ &pc) != TCL_OK) { return TCL_ERROR; } else { - int withPer_object = (int )pc.clientData[0]; - Tcl_Obj *name = (Tcl_Obj *)pc.clientData[1]; - Tcl_Obj *withDefault = (Tcl_Obj *)pc.clientData[2]; - int withEarlybinding = (int )pc.clientData[3]; - Tcl_Obj *withMethodprefix = (Tcl_Obj *)pc.clientData[4]; - int withObjscope = (int )pc.clientData[5]; - Tcl_Obj *withOnerror = (Tcl_Obj *)pc.clientData[6]; - int withVerbose = (int )pc.clientData[7]; - Tcl_Obj *target = (Tcl_Obj *)pc.clientData[8]; + Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; + Tcl_Obj *withDefault = (Tcl_Obj *)pc.clientData[1]; + int withEarlybinding = (int )pc.clientData[2]; + Tcl_Obj *withMethodprefix = (Tcl_Obj *)pc.clientData[3]; + int withObjscope = (int )pc.clientData[4]; + Tcl_Obj *withOnerror = (Tcl_Obj *)pc.clientData[5]; + int withVerbose = (int )pc.clientData[6]; + Tcl_Obj *target = (Tcl_Obj *)pc.clientData[7]; parseContextRelease(&pc); - return XOTclCForwardMethod(interp, cl, withPer_object, name, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); + return XOTclCForwardMethod(interp, cl, name, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); } } @@ -629,26 +625,6 @@ } static int -XOTclCSetterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - XOTclClass *cl = XOTclObjectToClass(clientData); - if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (ArgumentParse(interp, objc, objv, (XOTclObject *) cl, objv[0], - method_definitions[XOTclCSetterMethodIdx].paramDefs, - method_definitions[XOTclCSetterMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - int withPer_object = (int )pc.clientData[0]; - char *name = (char *)pc.clientData[1]; - - parseContextRelease(&pc); - return XOTclCSetterMethod(interp, cl, withPer_object, name); - - } -} - -static int XOTclClassInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1686,25 +1662,6 @@ } static int -XOTclOSetterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - XOTclObject *obj = (XOTclObject *)clientData; - if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (ArgumentParse(interp, objc, objv, obj, objv[0], - method_definitions[XOTclOSetterMethodIdx].paramDefs, - method_definitions[XOTclOSetterMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - char *name = (char *)pc.clientData[0]; - - parseContextRelease(&pc); - return XOTclOSetterMethod(interp, obj, name); - - } -} - -static int XOTclOUplevelMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); @@ -2101,6 +2058,26 @@ } } +static int +XOTclSetterCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclSetterCmdIdx].paramDefs, + method_definitions[XOTclSetterCmdIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + XOTclObject *object = (XOTclObject *)pc.clientData[0]; + char *methodName = (char *)pc.clientData[1]; + int withPer_object = (int )pc.clientData[2]; + + parseContextRelease(&pc); + return XOTclSetterCmd(interp, object, methodName, withPer_object); + + } +} + static methodDefinition method_definitions[] = { {"::xotcl::cmd::ParameterType::type=boolean", XOTclCheckBooleanArgsStub, 2, { {"name", 1, 0, convertToString}, @@ -2125,8 +2102,7 @@ {"filter", 1, 0, convertToString}, {"guard", 1, 0, convertToTclobj}} }, -{"::xotcl::cmd::Class::forward", XOTclCForwardMethodStub, 10, { - {"-per-object", 0, 0, convertToBoolean}, +{"::xotcl::cmd::Class::forward", XOTclCForwardMethodStub, 9, { {"name", 1, 0, convertToTclobj}, {"-default", 0, 1, convertToTclobj}, {"-earlybinding", 0, 0, convertToString}, @@ -2165,10 +2141,6 @@ {"name", 1, 0, convertToTclobj}, {"args", 0, 0, convertToNothing}} }, -{"::xotcl::cmd::Class::setter", XOTclCSetterMethodStub, 2, { - {"-per-object", 0, 0, convertToBoolean}, - {"name", 1, 0, convertToString}} -}, {"::xotcl::cmd::ClassInfo::filter", XOTclClassInfoFilterMethodStub, 3, { {"class", 1, 0, convertToClass}, {"-guards", 0, 0, convertToString}, @@ -2392,9 +2364,6 @@ {"::xotcl::cmd::Object::residualargs", XOTclOResidualargsMethodStub, 1, { {"args", 0, 0, convertToNothing}} }, -{"::xotcl::cmd::Object::setter", XOTclOSetterMethodStub, 1, { - {"name", 1, 0, convertToString}} -}, {"::xotcl::cmd::Object::uplevel", XOTclOUplevelMethodStub, 1, { {"args", 0, 0, convertToNothing}} }, @@ -2488,6 +2457,11 @@ {"object", 1, 0, convertToObject}, {"variable", 1, 0, convertToTclobj}, {"value", 0, 0, convertToTclobj}} +}, +{"::xotcl::setter", XOTclSetterCmdStub, 3, { + {"object", 1, 0, convertToObject}, + {"methodName", 1, 0, convertToString}, + {"-per-object", 0, 0, convertToBoolean}} } }; Index: generic/xotcl.c =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- generic/xotcl.c (.../xotcl.c) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ generic/xotcl.c (.../xotcl.c) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -10177,17 +10177,8 @@ Tcl_Command cmd, newCmd = NULL; Tcl_Namespace *nsPtr; int flags, result; - char allocation; + XOTclClass *cl = (withPer_object || ! XOTclObjectIsClass(object)) ? NULL : (XOTclClass *)object; - if (withPer_object) { - allocation = 'o'; - } else if (XOTclObjectIsClass(object)) { - allocation = 'c'; - } else { - allocation = 'o'; - } - - cmd = Tcl_GetCommandFromObj(interp, cmdName); if (cmd == NULL) { return XOTclVarErrMsg(interp, "cannot lookup command '", @@ -10199,37 +10190,19 @@ /* objProc is either ... - 1. XOTclObjDispatch: a command representing an xotcl object + 1. XOTclObjDispatch: a command representing an XOTcl object 2. TclObjInterpProc: a cmd standing for a Tcl proc (including XOTcl methods), verified through CmdIsProc() -> to be wrapped by XOTclProcAliasMethod() 3. XOTclForwardMethod: an XOTcl forwarder - 4. XOTclSetterMethod: an XOTcl parametercmd + 4. XOTclSetterMethod: an XOTcl setter - ... or other helper/ intermediate wrapper functions - (e.g., XOTclSetRelation) + 5. arbitrary Tcl commands (e.g. set, ..., ::xotcl::relation, ...) - 5. arbitrary Tcl commands (e.g. set, ...) - - TODO: only 1 & 2 are relevant, right? what about aliasing - forwarders? should there be explicit errors thrown on 3. (and - 4.?)? - - GN: why limit objProc; ideally, one should be able to use the - same mechanism for every method? - - TODO: where does '-objscope' makes sense? i'd say 2-4 (for now, - we consider only case 2). should there be an error thrown upon 1? - - GN: it make sense, whever an "input/output variable" targeted to the - current (proc)scope should should effect the instance - variables. 3&4 do not make sense (they set already instance - variables, one has to experience with e.g. procs + upvar) - - GN: i think, we should use XOTclProcAliasMethod, whenever the clientData + TODO GN: i think, we should use XOTclProcAliasMethod, whenever the clientData is not 0. These are the cases, where the clientData will be freed, when the original command is deleted. */ @@ -10271,22 +10244,23 @@ tcd->cmdName = object->cmdName; tcd->interp = interp; /* just for deleting the associated variable */ tcd->obj = object; - tcd->class = allocation == 'c' ? (XOTclClass *) object : NULL; + tcd->class = cl ? (XOTclClass *) object : NULL; tcd->objProc = objProc; tcd->aliasedCmd = cmd; tcd->clientData = Tcl_Command_objClientData(cmd); objProc = newObjProc; deleteProc = aliasCmdDeleteProc; if (tcd->cmdName) {INCR_REF_COUNT(tcd->cmdName);} } else { - /* call the command directly (must be a c-implemented command not depending on a volatile client data) */ + /* call the command directly (must be a c-implemented command not + * depending on a volatile client data) + */ tcd = Tcl_Command_objClientData(cmd); } flags = 0; - if (allocation == 'c') { - XOTclClass *cl = (XOTclClass *)object; + if (cl) { result = XOTclAddInstanceMethod(interp, (XOTcl_Class *)cl, methodName, objProc, tcd, deleteProc, flags); nsPtr = cl->nsPtr; @@ -10318,10 +10292,10 @@ /*if (withPer_object) {Tcl_DStringAppend(dsPtr, "-per-object ", -1);}*/ if (withObjscope) {Tcl_DStringAppend(dsPtr, "-objscope ", -1);} Tcl_DStringAppend(dsPtr, ObjStr(cmdName), -1); - AliasAdd(interp, object->cmdName, methodName, allocation == 'o', Tcl_DStringValue(dsPtr)); + AliasAdd(interp, object->cmdName, methodName, cl == NULL, Tcl_DStringValue(dsPtr)); Tcl_DStringFree(dsPtr); - result = ListMethodName(interp, object, allocation == 'o', methodName); + result = ListMethodName(interp, object, cl == NULL, methodName); } return result; @@ -11493,6 +11467,25 @@ return setInstVar(interp, object , variable, value); } +/* TODO move me at the right place */ +static int XOTclSetterCmd(Tcl_Interp *interp, XOTclObject *object, char *methodName, + int withPer_object) { + int result; + XOTclClass *cl = (withPer_object || ! XOTclObjectIsClass(object)) ? NULL : (XOTclClass *)object; + + if (cl) { + result = XOTclAddInstanceMethod(interp, (XOTcl_Class *)cl, methodName, + (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0, 0); + } else { + result = XOTclAddObjectMethod(interp, (XOTcl_Object *)object, methodName, + (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0, 0); + } + if (result == TCL_OK) { + result = ListMethodName(interp, object, withPer_object, methodName); + } + return result; +} + /*************************** * End generated XOTcl commands ***************************/ @@ -12050,7 +12043,6 @@ int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]) { forwardCmdClientData *tcd; - int result = forwardProcessOptions(interp, method, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, @@ -12467,29 +12459,6 @@ } /* TODO move me at the right place */ -static int XOTclCSetterMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, char *methodName) { - int result; - if (withPer_object) { - result = XOTclAddObjectMethod(interp, (XOTcl_Object*) cl, methodName, (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0, 0); - } else { - result = XOTclAddInstanceMethod(interp, (XOTcl_Class *)cl, methodName, (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0, 0); - } - if (result == TCL_OK) { - result = ListMethodName(interp, &cl->object, withPer_object, methodName); - } - return result; -} - -static int XOTclOSetterMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName) { - int result = XOTclAddObjectMethod(interp, (XOTcl_Object*) object, methodName, - (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0, 0); - if (result == TCL_OK) { - result = ListMethodName(interp, object, 1, methodName); - } - return result; -} - -/* TODO move me at the right place */ static int XOTclOMethodMethod(Tcl_Interp *interp, XOTclObject *obj, int withInner_namespace, int withPublic, Tcl_Obj *name, Tcl_Obj *args, Tcl_Obj *body, @@ -12512,36 +12481,25 @@ } static int XOTclCForwardMethod(Tcl_Interp *interp, XOTclClass *cl, - int withPer_object, Tcl_Obj *method, + Tcl_Obj *method, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]) { forwardCmdClientData *tcd; - int result; - CONST char *methodName; - - result = forwardProcessOptions(interp, method, - withDefault, withEarlybinding, withMethodprefix, - withObjscope, withOnerror, withVerbose, - target, nobjc, nobjv, &tcd); - if (result != TCL_OK) { - return result; - } - methodName = NSTail(ObjStr(method)); - if (withPer_object) { + int result = forwardProcessOptions(interp, method, + withDefault, withEarlybinding, withMethodprefix, + withObjscope, withOnerror, withVerbose, + target, nobjc, nobjv, &tcd); + if (result == TCL_OK) { + CONST char *methodName = NSTail(ObjStr(method)); tcd->obj = &cl->object; - result = XOTclAddObjectMethod(interp, (XOTcl_Object *)cl, methodName, - (Tcl_ObjCmdProc*)XOTclForwardMethod, - (ClientData)tcd, forwardCmdDeleteProc, 0); - } else { - tcd->obj = &cl->object; result = XOTclAddInstanceMethod(interp, (XOTcl_Class*)cl, methodName, (Tcl_ObjCmdProc*)XOTclForwardMethod, (ClientData)tcd, forwardCmdDeleteProc, 0); + if (result == TCL_OK) { + result = ListMethodName(interp, &cl->object, 0, methodName); + } } - if (result == TCL_OK) { - result = ListMethodName(interp, &cl->object, withPer_object, methodName); - } return result; } Index: library/lib/xotcl1.xotcl =================================================================== diff -u -r2f283277aff2bb9488419a4fbe2442a5b17546e5 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision 2f283277aff2bb9488419a4fbe2442a5b17546e5) +++ library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -376,7 +376,7 @@ Object instproc ismixin {class} {::xotcl::is [self] mixin $class} Object instproc istype {class} {::xotcl::is [self] type $class} - ::xotcl::alias Object parametercmd ::xotcl::cmd::Object::setter + ::xotcl::alias Object parametercmd ::xotcl::classes::xotcl2::Object::setter ::xotcl::alias Object contains ::xotcl::classes::xotcl2::Object::contains ::xotcl::Class forward slots %self contains \ @@ -387,8 +387,8 @@ # define parametercmd and instparametercmd in terms of setter # define mixinguard and instmixinguard in terms of mixinguard # - ::xotcl::alias Class instparametercmd ::xotcl::cmd::Class::setter - ::xotcl::alias Class parametercmd ::xotcl::cmd::Object::setter + ::xotcl::alias Class instparametercmd ::xotcl::classes::xotcl2::Class::setter + #::xotcl::alias Class parametercmd ::xotcl::cmd::Object::setter ::xotcl::alias Class filterguard ::xotcl::cmd::Object::filterguard ::xotcl::alias Class instfilterguard ::xotcl::cmd::Class::filterguard ::xotcl::alias Class mixinguard ::xotcl::cmd::Object::mixinguard Index: tests/aliastest.xotcl =================================================================== diff -u -r1f0231a5c7cbb8dfef4eaf78335c9ad571863660 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- tests/aliastest.xotcl (.../aliastest.xotcl) (revision 1f0231a5c7cbb8dfef4eaf78335c9ad571863660) +++ tests/aliastest.xotcl (.../aliastest.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -111,49 +111,49 @@ ::xotcl::alias T BAR -per-object ::T::FOO ::xotcl::alias T ZAP -per-object ::T::BAR ? {T info methods -methodtype scripted} {foo} -? {lsort [T info -per-object methods -methodtype alias]} {BAR FOO ZAP} -? {lsort [T info -per-object methods -methodtype scripted]} {BAR FOO ZAP bar} +? {lsort [T object info methods -methodtype alias]} {BAR FOO ZAP} +? {lsort [T object info methods -methodtype scripted]} {BAR FOO ZAP bar} ? {t foo} ::T->foo -? {T info -per-object method definition ZAP} {::T alias -per-object ZAP ::T::BAR} +? {T object info method definition ZAP} {::T alias -per-object ZAP ::T::BAR} ? {T FOO} ->foo ? {T BAR} ->foo ? {T ZAP} ->foo ? {T bar} ->bar T method -per-object FOO {} {} ? {T info methods -methodtype scripted} {foo} -? {lsort [T info -per-object methods -methodtype scripted]} {BAR ZAP bar} +? {lsort [T object info methods -methodtype scripted]} {BAR ZAP bar} ? {T BAR} ->foo ? {T ZAP} ->foo rename ::T::BAR "" ? {T info methods -methodtype scripted} {foo} -? {lsort [T info -per-object methods -methodtype scripted]} {ZAP bar} +? {lsort [T object info methods -methodtype scripted]} {ZAP bar} #? {T BAR} ""; # now calling the proc defined above, alias chain seems intact ? {T ZAP} ->foo; # is ok, still pointing to 'foo' #T method -per-object BAR {} {} ? {T info methods -methodtype scripted} {foo} -? {lsort [T info -per-object methods -methodtype scripted]} {ZAP bar} +? {lsort [T object info methods -methodtype scripted]} {ZAP bar} ? {T ZAP} ->foo T method foo {} {} ? {T info methods -methodtype scripted} {} -? {lsort [T info -per-object methods -methodtype scripted]} {bar} +? {lsort [T object info methods -methodtype scripted]} {bar} # # per-object methods as per-object aliases # T method -per-object m1 args { return [self class]->[self proc] } ::xotcl::alias T M1 -per-object ::T::m1 ::xotcl::alias T M11 -per-object ::T::M1 -? {lsort [T info -per-object methods -methodtype scripted]} {M1 M11 bar m1} +? {lsort [T object info methods -methodtype scripted]} {M1 M11 bar m1} ? {T m1} ->m1 ? {T M1} ->m1 ? {T M11} ->m1 T method -per-object M1 {} {} -? {lsort [T info -per-object methods -methodtype scripted]} {M11 bar m1} +? {lsort [T object info methods -methodtype scripted]} {M11 bar m1} ? {T m1} ->m1 ? {T M11} ->m1 T method -per-object m1 {} {} -? {lsort [T info -per-object methods -methodtype scripted]} {bar} +? {lsort [T object info methods -methodtype scripted]} {bar} # # a proc as alias @@ -166,7 +166,7 @@ # ! per-object alias referenced as per-class alias ! # ::xotcl::alias T BAR ::T::FOO2 -? {lsort [T info -per-object methods -methodtype scripted]} {FOO2 bar} +? {lsort [T object info methods -methodtype scripted]} {FOO2 bar} ? {lsort [T info methods -methodtype scripted]} {BAR FOO1} ? {T FOO2} ->foo ? {t FOO1} ::T->foo @@ -175,7 +175,7 @@ # delete proc # rename foo "" -? {lsort [T info -per-object methods -methodtype scripted]} {bar} +? {lsort [T object info methods -methodtype scripted]} {bar} ? {lsort [T info methods -methodtype scripted]} {} # namespaced procs + namespace deletion @@ -210,12 +210,12 @@ U method -per-object bar args { return [self class]->[self proc] } ::xotcl::alias U BAR -per-object ::U::bar -? {lsort [U info -per-object methods -methodtype scripted]} {BAR ZAP bar zap} +? {lsort [U object info methods -methodtype scripted]} {BAR ZAP bar zap} ? {U BAR} ->bar ? {U ZAP} ->zap namespace delete ::U ? {namespace exists ::U} 0 -? {lsort [U info -per-object methods -methodtype scripted]} {} +? {lsort [U object info methods -methodtype scripted]} {} ? {U info callable BAR} "" ? {U info callable ZAP} "" @@ -238,14 +238,14 @@ ::xotcl::alias V FOO1 ::foo ::xotcl::alias V FOO2 -per-object ::foo -? {lsort [V info -per-object methods -methodtype scripted]} {FOO2 bar} +? {lsort [V object info methods -methodtype scripted]} {FOO2 bar} ? {lsort [V info methods -methodtype scripted]} {FOO1 bar} ? {V FOO2} 1-1-1 ? {v FOO1} 2-2-2 V method FOO1 {} {} ? {lsort [V info methods -methodtype scripted]} {bar} rename ::foo "" -? {lsort [V info -per-object methods -methodtype scripted]} {bar} +? {lsort [V object info methods -methodtype scripted]} {bar} # Index: tests/info-method.xotcl =================================================================== diff -u -r142687efa93af981936db61ecfde494d8f269b0a -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- tests/info-method.xotcl (.../info-method.xotcl) (revision 142687efa93af981936db61ecfde494d8f269b0a) +++ tests/info-method.xotcl (.../info-method.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -24,14 +24,14 @@ .method m-with-assertions {} {return proc-[self proc]} -precondition 1 -postcondition 2 .forward addOne expr 1 + - .forward -per-object add1 expr 1 + - .forward -per-object fpo ::o + .object forward add1 expr 1 + + .object forward fpo ::o .setter s - .setter -per-object spo + .object setter spo .alias a ::set - .alias -per-object apo ::puts + .object alias apo ::puts } C create c1 @@ -50,11 +50,11 @@ ? {c1 info callable -which foo} "::c1 method foo {} {puts foo}" ? {C info method name m} "::xotcl::classes::C::m" -? {C info -per-object method name mpo} "::C::mpo" +? {C object info method name mpo} "::C::mpo" ? {C info method definition m} {::C method m x {return proc-[self proc]}} ? {C info method def m} {::C method m x {return proc-[self proc]}} -? {C info -per-object method definition mpo} {::C method -per-object mpo {} {return instproc-[self proc]}} +? {C object info method definition mpo} {::C method -per-object mpo {} {return instproc-[self proc]}} ? {C info method definition m-with-assertions} \ {::C method m-with-assertions {} {return proc-[self proc]} -precondition 1 -postcondition 2} ? {C info method parameter m} {x} @@ -66,11 +66,11 @@ ? {catch {C info method parameter a}} 1 ? {C info method definition addOne} "::C forward addOne expr 1 +" -? {C info -per-object method definition add1} "::C forward -per-object add1 expr 1 +" -? {C info -per-object method definition fpo} "::C forward -per-object fpo ::o" +? {C object info method definition add1} "::C forward -per-object add1 expr 1 +" +? {C object info method definition fpo} "::C forward -per-object fpo ::o" ? {C info method definition s} "::C setter s" -? {C info -per-object method definition spo} "::C setter -per-object spo" +? {C object info method definition spo} "::C setter -per-object spo" ? {C info method definition a} "::C alias a ::set" -? {C info -per-object method definition apo} "::C alias -per-object apo ::puts" +? {C object info method definition apo} "::C alias -per-object apo ::puts" Index: tests/interceptor-slot.xotcl =================================================================== diff -u -r1f0231a5c7cbb8dfef4eaf78335c9ad571863660 -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- tests/interceptor-slot.xotcl (.../interceptor-slot.xotcl) (revision 1f0231a5c7cbb8dfef4eaf78335c9ad571863660) +++ tests/interceptor-slot.xotcl (.../interceptor-slot.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -21,6 +21,7 @@ Class create M2 Class create C ? {C info callable -which mixin} "::xotcl2::Object forward mixin ::xotcl2::Object::slot::mixin {%1 {get assign}} %self {%-per-object 0} %proc" +#? {C info callable -which mixin} "::xotcl2::Object forward mixin ::xotcl2::Object::slot::mixin {%1 {get assign}} %self %proc" C mixin M ? {C info precedence} "::xotcl2::Class ::xotcl2::Object" ? {C mixin} "::M" @@ -54,7 +55,7 @@ # ::xotcl::relation C -per-object mixin M ? {C info precedence} "::M ::xotcl2::Class ::xotcl2::Object" -? {C info -per-object mixin} "::M" +? {C object info mixin} "::M" ::xotcl::relation C -per-object mixin "" ? {C info precedence} "::xotcl2::Class ::xotcl2::Object" Index: tests/method-modifiers.xotcl =================================================================== diff -u -r962c96dcc0ddc25782570a831c104fb2b955891d -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- tests/method-modifiers.xotcl (.../method-modifiers.xotcl) (revision 962c96dcc0ddc25782570a831c104fb2b955891d) +++ tests/method-modifiers.xotcl (.../method-modifiers.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -37,17 +37,17 @@ # object .object method plain_object_method {} {return [self proc]} - .object public method public_object_method {} {return [self proc]} - .object protected method protected_object_method {} {return [self proc]} + .public object method public_object_method {} {return [self proc]} + .protected object method protected_object_method {} {return [self proc]} .object forward plain_object_forward %self plain_object_method - .object public forward public_object_forward %self public_object_method - .object protected forward protected_object_forward %self protected_object_method + .public object forward public_object_forward %self public_object_method + .protected object forward protected_object_forward %self protected_object_method .object setter plain_object_setter - .object public setter public_object_setter - .object protected setter protected_object_setter - .object alias plain_object_alias [.info -per-object method name plain_object_method] - .object public alias public_object_alias [.info -per-object method name public_object_method] - .object protected alias protected_object_alias [.info -per-object method name protected_object_method] + .public object setter public_object_setter + .protected object setter protected_object_setter + .object alias plain_object_alias [.object info method name plain_object_method] + .public object alias public_object_alias [.object info method name public_object_method] + .protected object alias protected_object_alias [.object info method name protected_object_method] } C create c1 { # methods @@ -156,4 +156,8 @@ ? {catch {c1 protected_object_alias}} 1 ? {::xotcl::dispatch c1 protected_object_alias} "protected_object_method" +? {lsort [c1 info methods]} \ + "plain_object_alias plain_object_forward plain_object_method plain_object_setter public_object_alias public_object_forward public_object_method public_object_setter" +? {lsort [C object info methods]} \ + "plain_object_alias plain_object_forward plain_object_method plain_object_setter public_object_alias public_object_forward public_object_method public_object_setter s3" Index: tests/testx.xotcl =================================================================== diff -u -r962c96dcc0ddc25782570a831c104fb2b955891d -rd56d2a8ee3f246c9891783abb09bd820dbc508e4 --- tests/testx.xotcl (.../testx.xotcl) (revision 962c96dcc0ddc25782570a831c104fb2b955891d) +++ tests/testx.xotcl (.../testx.xotcl) (revision d56d2a8ee3f246c9891783abb09bd820dbc508e4) @@ -3103,13 +3103,13 @@ ::errorCheck [lsort [b info methods]] "__next abstract append array autoname check class cleanup configure contains copy defaultmethod destroy eval exists extractConfigureArg f filter filterguard filtersearch forward hasclass incr info init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move myProc myProc2 myProcMix1 myProcMix2 noinit objectparameter objproc parametercmd proc procsearch requireNamespace residualargs self set setFilter signature subst trace unknown unset uplevel upvar volatile vwait" "b info methods" - ::errorCheck [lsort [b info methods -nocmds]] "abstract contains copy defaultmethod extractConfigureArg f hasclass init isclass ismetaclass ismixin isobject istype method move myProc myProc2 myProcMix1 myProcMix2 objectparameter objproc proc procsearch self setFilter signature unknown" "b info methods -nocmds" + ::errorCheck [lsort [b info methods -nocmds]] "abstract contains copy defaultmethod extractConfigureArg f hasclass init isclass ismetaclass ismixin isobject istype method move myProc myProc2 myProcMix1 myProcMix2 objectparameter objproc parametercmd proc procsearch self setFilter signature unknown" "b info methods -nocmds" - ::errorCheck [lsort [b info methods -noprocs]] "__next append array autoname check class cleanup configure destroy eval exists filter filterguard filtersearch forward incr info instvar invar lappend mixin mixinguard noinit parametercmd requireNamespace residualargs set subst trace unset uplevel upvar volatile vwait" "b info methods -noprocs" - ::errorCheck [lsort [b info methods -nocmds -nomixins]] "abstract contains copy defaultmethod extractConfigureArg f hasclass init isclass ismetaclass ismixin isobject istype method move myProc myProc2 objectparameter objproc proc procsearch self setFilter signature unknown" "b info methods -nocmds -nomixins" + ::errorCheck [lsort [b info methods -noprocs]] "__next append array autoname check class cleanup configure destroy eval exists filter filterguard filtersearch forward incr info instvar invar lappend mixin mixinguard noinit requireNamespace residualargs set subst trace unset uplevel upvar volatile vwait" "b info methods -noprocs" + ::errorCheck [lsort [b info methods -nocmds -nomixins]] "abstract contains copy defaultmethod extractConfigureArg f hasclass init isclass ismetaclass ismixin isobject istype method move myProc myProc2 objectparameter objproc parametercmd proc procsearch self setFilter signature unknown" "b info methods -nocmds -nomixins" ::errorCheck [b info methods -nocmds -noprocs] "" "b info methods -nocmds -noprocs" - ::errorCheck [lsort [B info methods -nocmds]] "abstract allinstances contains copy defaultmethod extractConfigureArg f hasclass init instproc isclass ismetaclass ismixin isobject istype method move objectparameter parameter proc procsearch self setFilter signature unknown uses" "B info methods -nocmds" + ::errorCheck [lsort [B info methods -nocmds]] "abstract allinstances contains copy defaultmethod extractConfigureArg f hasclass init instparametercmd instproc isclass ismetaclass ismixin isobject istype method move objectparameter parameter parametercmd proc procsearch self setFilter signature unknown uses" "B info methods -nocmds" namespace eval a { proc o args {return o}