Index: TODO =================================================================== diff -u -r0c534a6693afbced7859c4189b62e712acc8f955 -r06ee7ba8b56117d63ad5ef251885efc92be5ddf5 --- TODO (.../TODO) (revision 0c534a6693afbced7859c4189b62e712acc8f955) +++ TODO (.../TODO) (revision 06ee7ba8b56117d63ad5ef251885efc92be5ddf5) @@ -1653,6 +1653,12 @@ - removed "info forward" from nx::Object and nx::Class (can be replaced by "info methods" and "info method") +- Methodpaths can be used now in the definition of "method", + "alias" and "forward." We do not support it for "setter" + and "attribute", since these require a parameter spec, + which does not have clear semantics for a method path. +- scripted definition of nx::Object.forward and nx::Class.forward + TODO: - cleanup of xotcl-aol @@ -1671,7 +1677,6 @@ - extend coro regression test - subcmd - * handle subcmd for other method factories * handle absence of -create flag in resolve_method_path (for introspection) - serializer: * keep track of defaultMethodProtection Index: generic/nsf.c =================================================================== diff -u -r0c534a6693afbced7859c4189b62e712acc8f955 -r06ee7ba8b56117d63ad5ef251885efc92be5ddf5 --- generic/nsf.c (.../nsf.c) (revision 0c534a6693afbced7859c4189b62e712acc8f955) +++ generic/nsf.c (.../nsf.c) (revision 06ee7ba8b56117d63ad5ef251885efc92be5ddf5) @@ -1198,8 +1198,10 @@ *regObject = referencedObject; *defObject = referencedObject; if (referencedObject == NULL) { - /* the cmd was not registered on an object or class */ - cmd = NULL; + /* + * The cmd was not registered on an object or class, but we + * still report back the cmd (might be e.g. a primitive cmd. + */ } } else { *methodName1 = methodName; @@ -11853,7 +11855,8 @@ } static int -ListChildren(Tcl_Interp *interp, NsfObject *object, CONST char *pattern, int classesOnly, NsfClass *type) { +ListChildren(Tcl_Interp *interp, NsfObject *object, CONST char *pattern, + int classesOnly, NsfClass *type) { NsfObject *childObject; Tcl_HashTable *cmdTablePtr; @@ -15776,7 +15779,7 @@ dsPtr, ®Object, &defObject, &methodName1, &fromClassNS); /*fprintf(stderr, "NsfClassInfoMethodMethod object %p regObject %p defObject %p fromClass %d cmd %p\n", - &class->object,regObject,defObject,fromClassNS, cmd);*/ + &class->object,regObject,defObject,fromClassNS, cmd);*/ result = ListMethod(interp, regObject ? regObject : &class->object, defObject ? defObject : &class->object, Index: library/nx/nx.tcl =================================================================== diff -u -r0c534a6693afbced7859c4189b62e712acc8f955 -r06ee7ba8b56117d63ad5ef251885efc92be5ddf5 --- library/nx/nx.tcl (.../nx.tcl) (revision 0c534a6693afbced7859c4189b62e712acc8f955) +++ library/nx/nx.tcl (.../nx.tcl) (revision 06ee7ba8b56117d63ad5ef251885efc92be5ddf5) @@ -258,13 +258,37 @@ :protected method objectparameter {} {;} } - # define forward methods + # + # Define forward methods + # + # We could do this simply as + # + # ::nsf::forward Object forward ::nsf::forward %self -per-object + # ::nsf::forward Class forward ::nsf::forward %self + # + # but then, we would loose the option to use compound names + # - ::nsf::forward Object forward ::nsf::forward %self -per-object - #set ::nsf::signature(::nx::Object-method-forward) {(methodName) obj forward name ?-default default? ?-earlybinding? ?-methodprefix name? ?-objscope? ?-onerror proc? ?-verbose? target ?args?} + Object public method forward { + method + -default -methodprefix -objscope:switch -onerror -verbose:switch + target:optional args + } { + array set "" [:__resolve_method_path -create -verbose $method] + return [::nsf::forward $(object) -per-object $(methodName) \ + {*}[lrange [::nsf::current args] 1 end]] + } + Class public method forward { + method + -default -methodprefix -objscope:switch -onerror -verbose:switch + target:optional args + } { + array set "" [:__resolve_method_path -create -verbose $method] + return [::nsf::forward $(object) $(methodName) \ + {*}[lrange [::nsf::current args] 1 end]] + } - ::nsf::forward Class forward ::nsf::forward %self - + # # The method __unknown is called in cases, where we try to resolve # an unkown class. one could define a custom resolver with this name # to load the class on the fly. After the call to __unknown, XOTcl @@ -1477,5 +1501,7 @@ unset bootstrap } + puts stderr "**** [nx::Object info method parameter ::nsf::forward] ***" + puts stderr =======NX-done Index: tests/parameters.tcl =================================================================== diff -u -r1bc14766b62efc778ac40c26b1bbabac116a9f80 -r06ee7ba8b56117d63ad5ef251885efc92be5ddf5 --- tests/parameters.tcl (.../parameters.tcl) (revision 1bc14766b62efc778ac40c26b1bbabac116a9f80) +++ tests/parameters.tcl (.../parameters.tcl) (revision 06ee7ba8b56117d63ad5ef251885efc92be5ddf5) @@ -560,9 +560,9 @@ "name arguments body -precondition -postcondition" \ "query instparams for scripted method 'method'" - ? {catch {Object info method parameter forward}} \ - "1" \ - "query parameter for C-defined method 'forward'" + ? {Object info method parameter ::nsf::forward} \ + "object -per-object method -default -earlybinding -methodprefix -objscope -onerror -verbose target:optional args" \ + "query parameter for C-defined cmd 'nsf::forward'" Object require method autoname ? {Object info method parameter autoname} \