Index: TODO =================================================================== diff -u -rc15b56a1490c74cfca4ffd2bf54034526dcf8ef2 -r4536c2540977c43aaf422800dab048e5d9063b3f --- TODO (.../TODO) (revision c15b56a1490c74cfca4ffd2bf54034526dcf8ef2) +++ TODO (.../TODO) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -2464,10 +2464,37 @@ not needed anymore (search for ns_cache_flush) - silence compilation when compiled without dtrace +- nx: + * removed methods ::nx::Class.alloc and + ::nx::Class.dealloc from predefined method-set + * added defintions such that these methods can be loaded via + ::nsf::method::require ::nx::Class alloc + ::nsf::method::require ::nx::Class dealloc + * make explicit that "method ... require" returns a method-handle + + * removed misleading reference in error message, when a class-spefic + method was called on an object; solution is somewhat dangerous for + potentially unknwon client data + + * added regression tests + TODO: +- when alloc|dealloc are loaded via require, we have + no redefined-protection on those. Since the script does not know, + on which class|object these are defined one cannot make assumption + on these. Problem? +- The structure of the script body requires currently that + "class|object ?-per-object?" is inserted at the 1nd pos. + This is not sufficient, if we would like to test in this + script, whether the first arg is e.g. a class. +- make pot.unknown client data more safe (see above) +- check removal of more internal-callback methods +- update method-summary and differences to xotcl + in tutorial/migration guide + - document value added replacements of Tcl functions - object parameter type forward: Index: generic/gentclAPI.tcl =================================================================== diff -u -r564b282ab8a82850c60b8f0ef8a23a6719fbcc77 -r4536c2540977c43aaf422800dab048e5d9063b3f --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 564b282ab8a82850c60b8f0ef8a23a6719fbcc77) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -97,14 +97,14 @@ set if [list "NsfClass *cl"] append intro \ " NsfClass *cl = NsfObjectToClass(clientData);" \n \ - { if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL);} + { if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL);} } object { set a [list obj] set if [list "NsfObject *obj"] append intro \ " NsfObject *obj = (NsfObject *)clientData;" \n \ - { if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL);} + { if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL);} } "" { append intro " (void)clientData;\n" Index: generic/nsf.c =================================================================== diff -u -rc15b56a1490c74cfca4ffd2bf54034526dcf8ef2 -r4536c2540977c43aaf422800dab048e5d9063b3f --- generic/nsf.c (.../nsf.c) (revision c15b56a1490c74cfca4ffd2bf54034526dcf8ef2) +++ generic/nsf.c (.../nsf.c) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -2348,8 +2348,8 @@ } else if ((osPtr->definedMethods & flag) == 0) { /* not defined, we must call directly */ // TODO remove me - fprintf(stderr, "Warning: CallDirectly object %s idx %s not defined\n", - ObjectName(object), Nsf_SytemMethodOpts[methodIdx]+1); + /*fprintf(stderr, "Warning: CallDirectly object %s idx %s not defined\n", + ObjectName(object), Nsf_SytemMethodOpts[methodIdx]+1);*/ } else { if (!(object->flags & NSF_FILTER_ORDER_VALID)) { FilterComputeDefined(interp, object); Index: generic/nsf.tcl =================================================================== diff -u -r596677fb3ed1e15dc62a04789781347fb3dbc369 -r4536c2540977c43aaf422800dab048e5d9063b3f --- generic/nsf.tcl (.../nsf.tcl) (revision 596677fb3ed1e15dc62a04789781347fb3dbc369) +++ generic/nsf.tcl (.../nsf.tcl) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -30,9 +30,9 @@ } if {$per_object} { set cmd [linsert $(definition) 1 -per-object] - eval [linsert $cmd 1 $object] + return [eval [linsert $cmd 1 $object]] } else { - eval [linsert $(definition) 1 $object] + return [eval [linsert $(definition) 1 $object]] } } else { error "cannot require method $name for $object, method unknown" @@ -69,7 +69,7 @@ # ::nsf::mixin # # Provide a similar interface as for ::nsf::method::create, ::nsf::method::alias, - # etc.. Semantically, ::nsf::mxiin behaves like a "mixin add", but + # etc.. Semantically, ::nsf::mixin behaves like a "mixin add", but # can be used as well for deleting the mixin list (empty last # argument). # @@ -89,7 +89,7 @@ # provide some popular methods for "method require" # ::nsf::method::provide autoname {::nsf::method::alias autoname ::nsf::methods::object::autoname} - ::nsf::method::provide exists {::nsf::method::alias exists ::nsf::methods::object::exists} + ::nsf::method::provide exists {::nsf::method::alias exists ::nsf::methods::object::exists} # # exit handlers Index: generic/predefined.h =================================================================== diff -u -r596677fb3ed1e15dc62a04789781347fb3dbc369 -r4536c2540977c43aaf422800dab048e5d9063b3f --- generic/predefined.h (.../predefined.h) (revision 596677fb3ed1e15dc62a04789781347fb3dbc369) +++ generic/predefined.h (.../predefined.h) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -14,8 +14,8 @@ "eval $(script)}\n" "if {$per_object} {\n" "set cmd [linsert $(definition) 1 -per-object]\n" -"eval [linsert $cmd 1 $object]} else {\n" -"eval [linsert $(definition) 1 $object]}} else {\n" +"return [eval [linsert $cmd 1 $object]]} else {\n" +"return [eval [linsert $(definition) 1 $object]]}} else {\n" "error \"cannot require method $name for $object, method unknown\"}}\n" "nsf::proc ::nsf::method::delete {object:object -per-object:switch methodName} {\n" "set scope [expr {${per-object} ? \"object\" : \"class\"}]\n" @@ -34,7 +34,7 @@ "uplevel [list ::nsf::relation $object $rel [linsert $oldSetting 0 $classes]]} else {\n" "uplevel [list ::nsf::relation $object $rel \"\"]}}\n" "::nsf::method::provide autoname {::nsf::method::alias autoname ::nsf::methods::object::autoname}\n" -"::nsf::method::provide exists {::nsf::method::alias exists ::nsf::methods::object::exists}\n" +"::nsf::method::provide exists {::nsf::method::alias exists ::nsf::methods::object::exists}\n" "proc ::nsf::exithandler {args} {\n" "lassign $args op value\n" "switch $op {\n" Index: generic/tclAPI.h =================================================================== diff -u -r65f8883a4596ea98365b7de1652700e3ac7394cc -r4536c2540977c43aaf422800dab048e5d9063b3f --- generic/tclAPI.h (.../tclAPI.h) (revision 65f8883a4596ea98365b7de1652700e3ac7394cc) +++ generic/tclAPI.h (.../tclAPI.h) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -460,7 +460,7 @@ static int NsfCAllocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (objc != 2) { @@ -477,7 +477,7 @@ NsfCCreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfCCreateMethodIdx].paramDefs, method_definitions[NsfCCreateMethodIdx].nrParameters, 1, @@ -495,7 +495,7 @@ static int NsfCDeallocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (objc != 2) { @@ -512,7 +512,7 @@ NsfCFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfCFilterGuardMethodIdx].paramDefs, method_definitions[NsfCFilterGuardMethodIdx].nrParameters, 1, @@ -532,7 +532,7 @@ NsfCMixinGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfCMixinGuardMethodIdx].paramDefs, method_definitions[NsfCMixinGuardMethodIdx].nrParameters, 1, @@ -552,7 +552,7 @@ NsfCNewMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfCNewMethodIdx].paramDefs, method_definitions[NsfCNewMethodIdx].nrParameters, 1, @@ -571,7 +571,7 @@ NsfCRecreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfCRecreateMethodIdx].paramDefs, method_definitions[NsfCRecreateMethodIdx].nrParameters, 1, @@ -590,7 +590,7 @@ NsfClassInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoFilterguardMethodIdx].paramDefs, method_definitions[NsfClassInfoFilterguardMethodIdx].nrParameters, 1, @@ -609,7 +609,7 @@ NsfClassInfoFiltermethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoFiltermethodsMethodIdx].paramDefs, method_definitions[NsfClassInfoFiltermethodsMethodIdx].nrParameters, 1, @@ -629,7 +629,7 @@ NsfClassInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoForwardMethodIdx].paramDefs, method_definitions[NsfClassInfoForwardMethodIdx].nrParameters, 1, @@ -649,7 +649,7 @@ NsfClassInfoHeritageMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoHeritageMethodIdx].paramDefs, method_definitions[NsfClassInfoHeritageMethodIdx].nrParameters, 1, @@ -668,7 +668,7 @@ NsfClassInfoInstancesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoInstancesMethodIdx].paramDefs, method_definitions[NsfClassInfoInstancesMethodIdx].nrParameters, 1, @@ -702,7 +702,7 @@ NsfClassInfoMethodMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoMethodMethodIdx].paramDefs, method_definitions[NsfClassInfoMethodMethodIdx].nrParameters, 1, @@ -722,7 +722,7 @@ NsfClassInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoMethodsMethodIdx].paramDefs, method_definitions[NsfClassInfoMethodsMethodIdx].nrParameters, 1, @@ -746,7 +746,7 @@ NsfClassInfoMixinOfMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoMixinOfMethodIdx].paramDefs, method_definitions[NsfClassInfoMixinOfMethodIdx].nrParameters, 1, @@ -781,7 +781,7 @@ NsfClassInfoMixinclassesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoMixinclassesMethodIdx].paramDefs, method_definitions[NsfClassInfoMixinclassesMethodIdx].nrParameters, 1, @@ -816,7 +816,7 @@ NsfClassInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoMixinguardMethodIdx].paramDefs, method_definitions[NsfClassInfoMixinguardMethodIdx].nrParameters, 1, @@ -835,7 +835,7 @@ NsfClassInfoSubclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoSubclassMethodIdx].paramDefs, method_definitions[NsfClassInfoSubclassMethodIdx].nrParameters, 1, @@ -869,7 +869,7 @@ NsfClassInfoSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); - if (!cl) return NsfObjErrType(interp, NULL, objv[0], "Class", NULL); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], method_definitions[NsfClassInfoSuperclassMethodIdx].paramDefs, method_definitions[NsfClassInfoSuperclassMethodIdx].nrParameters, 1, @@ -1488,7 +1488,7 @@ NsfOAutonameMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfOAutonameMethodIdx].paramDefs, method_definitions[NsfOAutonameMethodIdx].nrParameters, 1, @@ -1508,7 +1508,7 @@ static int NsfOCleanupMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1524,7 +1524,7 @@ static int NsfOConfigureMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); return NsfOConfigureMethod(interp, obj, objc, objv); @@ -1534,7 +1534,7 @@ static int NsfODestroyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1551,7 +1551,7 @@ NsfOExistsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfOExistsMethodIdx].paramDefs, method_definitions[NsfOExistsMethodIdx].nrParameters, 1, @@ -1570,7 +1570,7 @@ NsfOFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfOFilterGuardMethodIdx].paramDefs, method_definitions[NsfOFilterGuardMethodIdx].nrParameters, 1, @@ -1589,7 +1589,7 @@ static int NsfOInstvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); return NsfOInstvarMethod(interp, obj, objc, objv); @@ -1600,7 +1600,7 @@ NsfOMixinGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfOMixinGuardMethodIdx].paramDefs, method_definitions[NsfOMixinGuardMethodIdx].nrParameters, 1, @@ -1619,7 +1619,7 @@ static int NsfONoinitMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1635,7 +1635,7 @@ static int NsfORequireNamespaceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1651,7 +1651,7 @@ static int NsfOResidualargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); return NsfOResidualargsMethod(interp, obj, objc, objv); @@ -1661,7 +1661,7 @@ static int NsfOUplevelMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); return NsfOUplevelMethod(interp, obj, objc, objv); @@ -1671,7 +1671,7 @@ static int NsfOUpvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); return NsfOUpvarMethod(interp, obj, objc, objv); @@ -1681,7 +1681,7 @@ static int NsfOVolatileMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1698,7 +1698,7 @@ NsfObjInfoChildrenMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoChildrenMethodIdx].paramDefs, method_definitions[NsfObjInfoChildrenMethodIdx].nrParameters, 1, @@ -1717,7 +1717,7 @@ static int NsfObjInfoClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1734,7 +1734,7 @@ NsfObjInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoFilterguardMethodIdx].paramDefs, method_definitions[NsfObjInfoFilterguardMethodIdx].nrParameters, 1, @@ -1753,7 +1753,7 @@ NsfObjInfoFiltermethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoFiltermethodsMethodIdx].paramDefs, method_definitions[NsfObjInfoFiltermethodsMethodIdx].nrParameters, 1, @@ -1774,7 +1774,7 @@ NsfObjInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoForwardMethodIdx].paramDefs, method_definitions[NsfObjInfoForwardMethodIdx].nrParameters, 1, @@ -1794,7 +1794,7 @@ NsfObjInfoHasMixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoHasMixinMethodIdx].paramDefs, method_definitions[NsfObjInfoHasMixinMethodIdx].nrParameters, 1, @@ -1813,7 +1813,7 @@ NsfObjInfoHasTypeMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoHasTypeMethodIdx].paramDefs, method_definitions[NsfObjInfoHasTypeMethodIdx].nrParameters, 1, @@ -1831,7 +1831,7 @@ static int NsfObjInfoHasnamespaceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -1848,7 +1848,7 @@ NsfObjInfoIsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoIsMethodIdx].paramDefs, method_definitions[NsfObjInfoIsMethodIdx].nrParameters, 1, @@ -1867,7 +1867,7 @@ NsfObjInfoLookupFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoLookupFilterMethodIdx].paramDefs, method_definitions[NsfObjInfoLookupFilterMethodIdx].nrParameters, 1, @@ -1885,7 +1885,7 @@ static int NsfObjInfoLookupMethodMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 2) { @@ -1902,7 +1902,7 @@ NsfObjInfoLookupMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoLookupMethodsMethodIdx].paramDefs, method_definitions[NsfObjInfoLookupMethodsMethodIdx].nrParameters, 1, @@ -1927,7 +1927,7 @@ NsfObjInfoLookupSlotsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoLookupSlotsMethodIdx].paramDefs, method_definitions[NsfObjInfoLookupSlotsMethodIdx].nrParameters, 1, @@ -1946,7 +1946,7 @@ NsfObjInfoMethodMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoMethodMethodIdx].paramDefs, method_definitions[NsfObjInfoMethodMethodIdx].nrParameters, 1, @@ -1966,7 +1966,7 @@ NsfObjInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoMethodsMethodIdx].paramDefs, method_definitions[NsfObjInfoMethodsMethodIdx].nrParameters, 1, @@ -1990,7 +1990,7 @@ NsfObjInfoMixinclassesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoMixinclassesMethodIdx].paramDefs, method_definitions[NsfObjInfoMixinclassesMethodIdx].nrParameters, 1, @@ -2025,7 +2025,7 @@ NsfObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoMixinguardMethodIdx].paramDefs, method_definitions[NsfObjInfoMixinguardMethodIdx].nrParameters, 1, @@ -2043,7 +2043,7 @@ static int NsfObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (objc != 1) { @@ -2060,7 +2060,7 @@ NsfObjInfoPrecedenceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoPrecedenceMethodIdx].paramDefs, method_definitions[NsfObjInfoPrecedenceMethodIdx].nrParameters, 1, @@ -2080,7 +2080,7 @@ NsfObjInfoVarsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfObject *obj = (NsfObject *)clientData; - if (!obj) return NsfObjErrType(interp, NULL, objv[0], "Object", NULL); + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); if (ArgumentParse(interp, objc, objv, obj, objv[0], method_definitions[NsfObjInfoVarsMethodIdx].paramDefs, method_definitions[NsfObjInfoVarsMethodIdx].nrParameters, 1, Index: library/nx/nx.tcl =================================================================== diff -u -rf0d274241d978847f40deb439e17172d7d8716d9 -r4536c2540977c43aaf422800dab048e5d9063b3f --- library/nx/nx.tcl (.../nx.tcl) (revision f0d274241d978847f40deb439e17172d7d8716d9) +++ library/nx/nx.tcl (.../nx.tcl) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -19,7 +19,7 @@ -class.requireobject __unknown -object.configure configure -object.defaultmethod defaultmethod - -object.destroy destroy + -object.destroy destroy -object.init init -object.move move -object.objectparameter objectparameter @@ -54,7 +54,7 @@ # provide the standard command set for Class foreach cmd [info command ::nsf::methods::class::*] { set cmdName [namespace tail $cmd] - if {$cmdName in [list "filterguard" "mixinguard"]} continue + if {$cmdName in [list "filterguard" "mixinguard" "alloc" "dealloc"]} continue # set tgt [Class ::nsf::methods::class::info::methods -methodtype alias -callprotection all $cmdName] #if {$tgt ne "" && [::nsf::method::property Class $cmdName redefine-protected]} { # ::nsf::method::property Class $cmdName redefine-protected false @@ -76,10 +76,13 @@ # protect some methods against redefinition ::nsf::method::property Object destroy redefine-protected true - ::nsf::method::property Class alloc redefine-protected true - ::nsf::method::property Class dealloc redefine-protected true + #::nsf::method::property Class alloc redefine-protected true + #::nsf::method::property Class dealloc redefine-protected true ::nsf::method::property Class create redefine-protected true + ::nsf::method::provide alloc {::nsf::method::alias alloc ::nsf::methods::class::alloc} + ::nsf::method::provide dealloc {::nsf::method::alias dealloc ::nsf::methods::class::dealloc} + # # The method __resolve_method_path resolves a space separated path # of a method name and creates from the path the necessary ensemble @@ -399,7 +402,7 @@ # Create slot container object if needed set slotContainer ${baseObject}::slot if {![::nsf::isobject $slotContainer]} { - ::nx::Object alloc $slotContainer + ::nx::Object ::nsf::methods::class::alloc $slotContainer ::nsf::method::property ${baseObject} -per-object slot call-protected true ::nsf::method::property ${baseObject} -per-object slot redefine-protected true ::nsf::method::property ${baseObject} -per-object slot slotcontainer true Index: tests/info-method.test =================================================================== diff -u -re3a84e351aaf79c02a63cc0741dde7b9bd550849 -r4536c2540977c43aaf422800dab048e5d9063b3f --- tests/info-method.test (.../info-method.test) (revision e3a84e351aaf79c02a63cc0741dde7b9bd550849) +++ tests/info-method.test (.../info-method.test) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -69,7 +69,7 @@ ? {::nx::Class info lookup methods -source application} "" set object_methods "alias attribute class configure contains copy destroy eval filter forward info method mixin move protected public require volatile" - set class_methods "alias alloc attribute attributes class class-object configure contains copy create dealloc destroy eval filter forward info method mixin move new protected public require superclass volatile" + set class_methods "alias attribute attributes class class-object configure contains copy create destroy eval filter forward info method mixin move new protected public require superclass volatile" ? {lsort [::nx::Object info lookup methods -source baseclasses]} $class_methods ? {lsort [::nx::Class info lookup methods -source baseclasses]} $class_methods Index: tests/method-require.test =================================================================== diff -u -r596677fb3ed1e15dc62a04789781347fb3dbc369 -r4536c2540977c43aaf422800dab048e5d9063b3f --- tests/method-require.test (.../method-require.test) (revision 596677fb3ed1e15dc62a04789781347fb3dbc369) +++ tests/method-require.test (.../method-require.test) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -78,3 +78,14 @@ ? {::1::2::3::4 info class} "::C" } +# +# Test what happens if a class-specific method is registered and +# called on an object. +# +Test case method-require-scope { + + nx::Object create o + ::nsf::method::require o alloc + ? {o alloc x} {expected Class but got "::o"} + +} \ No newline at end of file Index: tests/protected.test =================================================================== diff -u -re3a84e351aaf79c02a63cc0741dde7b9bd550849 -r4536c2540977c43aaf422800dab048e5d9063b3f --- tests/protected.test (.../protected.test) (revision e3a84e351aaf79c02a63cc0741dde7b9bd550849) +++ tests/protected.test (.../protected.test) (revision 4536c2540977c43aaf422800dab048e5d9063b3f) @@ -81,11 +81,11 @@ ? {catch {C method foo {a b c} {...}} errorMsg; set errorMsg} \ {Method 'foo' of ::C cannot be overwritten. Derive e.g. a sub-class!} # check a predefined protection -? {catch {::nx::Class method dealloc {a b c} {...}} errorMsg; set errorMsg} \ - {Method 'dealloc' of ::nx::Class cannot be overwritten. Derive e.g. a sub-class!} +? {catch {::nx::Class method create {a b c} {...}} errorMsg; set errorMsg} \ + {Method 'create' of ::nx::Class cannot be overwritten. Derive e.g. a sub-class!} # try to redefined via alias -? {catch {::nsf::method::alias Class dealloc ::set} errorMsg; set errorMsg} \ - {Method 'dealloc' of ::nx::Class cannot be overwritten. Derive e.g. a sub-class!} +? {catch {::nsf::method::alias Class create ::set} errorMsg; set errorMsg} \ + {Method 'create' of ::nx::Class cannot be overwritten. Derive e.g. a sub-class!} # try to redefine via forward ? {catch {C forward SET ::set} errorMsg; set errorMsg} \ {Method 'SET' of ::C cannot be overwritten. Derive e.g. a sub-class!}