Index: TODO =================================================================== diff -u -red6c291a4217ee648c4fb8264ce45c757a51578f -r3b7a544e17d23c11227445e2949b94b953fc312c --- TODO (.../TODO) (revision ed6c291a4217ee648c4fb8264ce45c757a51578f) +++ TODO (.../TODO) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -2513,8 +2513,18 @@ * added defintions such that these methods can be loaded via ::nsf::method::require ::nx::Object unknown +* added methods ::nsf::methods::object::class and + ::nsf::methods::class::superclass in order to make faster and nicer + looking objectparameters (compared with forwarders) +* nx: changed parameter -class to use ::nsf::methods::object::class +* ns: fixed chicken egg problem of method objectparameter needing + objectparameter by creating/destroying slot Class::slot::dummy; + otherwise default values for slots would not be available +* reduced verbosity of parameter forwarder TODO: +- maybe the destructor of a slot should remove the setter/forwarder +- how to delete attributes - when alloc|dealloc are loaded via require, we have no redefined-protection on those. Since the script does not know, Index: generic/gentclAPI.decls =================================================================== diff -u -red6c291a4217ee648c4fb8264ce45c757a51578f -r3b7a544e17d23c11227445e2949b94b953fc312c --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision ed6c291a4217ee648c4fb8264ce45c757a51578f) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -168,6 +168,10 @@ {-argName "name" -required 1 -type tclobj} } +objectMethod class NsfOClassMethod { + {-argName "class" -required 0 -type tclobj} +} + objectMethod cleanup NsfOCleanupMethod { } @@ -254,6 +258,10 @@ {-argName "args" -type allargs} } +classMethod superclass NsfCSuperclassMethod { + {-argName "superclasses" -required 0 -type tclobj} +} + # # info object methods # Index: generic/nsf.c =================================================================== diff -u -red6c291a4217ee648c4fb8264ce45c757a51578f -r3b7a544e17d23c11227445e2949b94b953fc312c --- generic/nsf.c (.../nsf.c) (revision ed6c291a4217ee648c4fb8264ce45c757a51578f) +++ generic/nsf.c (.../nsf.c) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -16818,6 +16818,16 @@ } /* +objectMethod class NsfOClassMethod { + {-argName "class" -required 0 -type tclobj} +} +*/ +static int +NsfOClassMethod(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *classObj) { + return NsfRelationCmd(interp, object, RelationtypeClassIdx, classObj); +} + +/* objectMethod cleanup NsfOCleanupMethod { } */ @@ -17027,16 +17037,16 @@ result = ForwardProcessOptions(interp, methodObj, NULL /*withDefault*/, 0 /*withEarlybinding*/, NULL /*withMethodprefix*/, 0 /*withObjframe*/, - NULL /*withOnerror*/, 1 /*withVerbose*/, + NULL /*withOnerror*/, 0 /*withVerbose*/, nobjv[0], nobjc-1, nobjv+1, &tcd); if (result != TCL_OK) { if (tcd) ForwardCmdDeleteProc((ClientData)tcd); goto method_arg_done; } - fprintf(stderr, "parameter %s forward spec <%s> After Options obj %s method %s\n", + /*fprintf(stderr, "parameter %s forward spec <%s> After Options obj %s method %s\n", ObjStr(paramPtr->nameObj), ObjStr(forwardSpec), - ObjectName(object), ObjStr(methodObj)); + ObjectName(object), ObjStr(methodObj));*/ tcd->object = object; ov[0] = methodObj; @@ -17978,6 +17988,16 @@ return RecreateObject(interp, cl, object, objc, objv); } +/* +classMethod superclass NsfCSuperclassMethod { + {-argName "superclasses" -required 0 -type tclobj} +} +*/ +static int +NsfCSuperclassMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *superclassesObj) { + return NsfRelationCmd(interp, &cl->object, RelationtypeSuperclassIdx, superclassesObj); +} + /*************************** * End Class Methods ***************************/ Index: generic/tclAPI.h =================================================================== diff -u -red6c291a4217ee648c4fb8264ce45c757a51578f -r3b7a544e17d23c11227445e2949b94b953fc312c --- generic/tclAPI.h (.../tclAPI.h) (revision ed6c291a4217ee648c4fb8264ce45c757a51578f) +++ generic/tclAPI.h (.../tclAPI.h) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -206,6 +206,7 @@ static int NsfCMixinGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfCNewMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfCRecreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int NsfCSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfClassInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfClassInfoFiltermethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfClassInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -250,6 +251,7 @@ static int NsfSetterCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfShowStackCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfOAutonameMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int NsfOClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfOCleanupMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfOConfigureMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfODestroyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -291,6 +293,7 @@ static int NsfCMixinGuardMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *mixin, Tcl_Obj *guard); static int NsfCNewMethod(Tcl_Interp *interp, NsfClass *cl, NsfObject *withChildof, int nobjc, Tcl_Obj *CONST nobjv[]); static int NsfCRecreateMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *objectName, int objc, Tcl_Obj *CONST objv[]); +static int NsfCSuperclassMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *superclasses); static int NsfClassInfoFilterguardMethod(Tcl_Interp *interp, NsfClass *cl, CONST char *filter); static int NsfClassInfoFiltermethodsMethod(Tcl_Interp *interp, NsfClass *cl, int withGuards, CONST char *pattern); static int NsfClassInfoForwardMethod(Tcl_Interp *interp, NsfClass *cl, int withDefinition, CONST char *name); @@ -335,6 +338,7 @@ static int NsfSetterCmd(Tcl_Interp *interp, NsfObject *object, int withPer_object, Tcl_Obj *parameter); static int NsfShowStackCmd(Tcl_Interp *interp); static int NsfOAutonameMethod(Tcl_Interp *interp, NsfObject *obj, int withInstance, int withReset, Tcl_Obj *name); +static int NsfOClassMethod(Tcl_Interp *interp, NsfObject *obj, Tcl_Obj *class); static int NsfOCleanupMethod(Tcl_Interp *interp, NsfObject *obj); static int NsfOConfigureMethod(Tcl_Interp *interp, NsfObject *obj, int objc, Tcl_Obj *CONST objv[]); static int NsfODestroyMethod(Tcl_Interp *interp, NsfObject *obj); @@ -377,6 +381,7 @@ NsfCMixinGuardMethodIdx, NsfCNewMethodIdx, NsfCRecreateMethodIdx, + NsfCSuperclassMethodIdx, NsfClassInfoFilterguardMethodIdx, NsfClassInfoFiltermethodsMethodIdx, NsfClassInfoForwardMethodIdx, @@ -421,6 +426,7 @@ NsfSetterCmdIdx, NsfShowStackCmdIdx, NsfOAutonameMethodIdx, + NsfOClassMethodIdx, NsfOCleanupMethodIdx, NsfOConfigureMethodIdx, NsfODestroyMethodIdx, @@ -587,6 +593,22 @@ } static int +NsfCSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + NsfClass *cl = NsfObjectToClass(clientData); + if (!cl) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Class", NULL); + + + if (objc < 1 || objc > 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfCSuperclassMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfCSuperclassMethod(interp, cl, objc == 2 ? objv[1] : NULL); + +} + +static int NsfClassInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); @@ -1506,6 +1528,22 @@ } static int +NsfOClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + NsfObject *obj = (NsfObject *)clientData; + if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); + + + if (objc < 1 || objc > 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfOClassMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfOClassMethod(interp, obj, objc == 2 ? objv[1] : NULL); + +} + +static int NsfOCleanupMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; if (!obj) return NsfObjErrType(interp, NULL, clientData ? ((NsfObject*)clientData)->cmdName : NsfGlobalObjs[NSF_EMPTY], "Object", NULL); @@ -2122,6 +2160,9 @@ {"objectName", NSF_ARG_REQUIRED, 0, ConvertToTclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL}, {"args", 0, 0, ConvertToNothing, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, +{"::nsf::methods::class::superclass", NsfCSuperclassMethodStub, 1, { + {"superclasses", 0, 0, ConvertToTclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} +}, {"::nsf::methods::class::info::filterguard", NsfClassInfoFilterguardMethodStub, 1, { {"filter", NSF_ARG_REQUIRED, 0, ConvertToString, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, @@ -2322,6 +2363,9 @@ {"-reset", 0, 0, ConvertToString, NULL,NULL,NULL,NULL,NULL,NULL,NULL}, {"name", NSF_ARG_REQUIRED, 0, ConvertToTclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, +{"::nsf::methods::object::class", NsfOClassMethodStub, 1, { + {"class", 0, 0, ConvertToTclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} +}, {"::nsf::methods::object::cleanup", NsfOCleanupMethodStub, 0, { {NULL, 0, 0, NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, Index: library/nx/nx.tcl =================================================================== diff -u -red6c291a4217ee648c4fb8264ce45c757a51578f -r3b7a544e17d23c11227445e2949b94b953fc312c --- library/nx/nx.tcl (.../nx.tcl) (revision ed6c291a4217ee648c4fb8264ce45c757a51578f) +++ library/nx/nx.tcl (.../nx.tcl) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -39,8 +39,8 @@ # foreach cmd [info command ::nsf::methods::object::*] { set cmdName [namespace tail $cmd] - if {$cmdName in [list "autoname" "cleanup" "exists" \ - "filterguard" "init" "instvar" "mixinguard" \ + if {$cmdName in [list "autoname" "cleanup" "class" "exists" \ + "filterguard" "instvar" "mixinguard" \ "noinit" "requirenamespace" "residualargs"]} continue ::nsf::method::alias Object $cmdName $cmd } @@ -62,8 +62,8 @@ # The default constructor proc ::nsf::methods::object::init args {} - # This method can be called on calls to object without a specified - # method. + # This method can be called on invocations of the object without a + # specified method. proc ::nsf::methods::object::defaultmethod {} {::nsf::self} # @@ -73,11 +73,8 @@ # 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" "alloc" "dealloc" "recreate"]} 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 - #} + if {$cmdName in [list "filterguard" "mixinguard" \ + "alloc" "dealloc" "recreate" "superclass"]} continue ::nsf::method::alias Class $cmdName $cmd unset cmdName } @@ -276,13 +273,10 @@ } } - Object eval { + # provide a placeholder for the bootup process. The real definition + # is based on slots, which are not available at this point. + Object protected method objectparameter {} {;} - # provide a placeholder for the bootup process. The real definition - # is based on slots, which are not available at this point. - :protected method objectparameter {} {;} - } - # # Define forward methods # @@ -719,6 +713,7 @@ #puts stderr "::nx::BootStrapAttributeSlot create $slotObj" ::nx::BootStrapAttributeSlot create $slotObj if {[info exists default]} { + #puts stderr "::nsf::var::set $slotObj default $default" ::nsf::var::set $slotObj default $default unset default } @@ -1040,9 +1035,11 @@ # # Most system slots are RelationSlots # - ::nx::RelationSlot create ${os}::Class::slot::superclass \ - -default ${os}::Object + ::nx::RelationSlot create ${os}::Class::slot::dummy + ${os}::Class::slot::dummy destroy + ::nsf::method::delete ${os}::Class dummy + ::nx::RelationSlot create ${os}::Object::slot::mixin \ -forwardername object-mixin ::nx::RelationSlot create ${os}::Object::slot::filter -elementtype "" \ @@ -1075,11 +1072,22 @@ # # method "class" is a plain forwarder to relation (no slot) #::nsf::method::forward ${os}::Object class ::nsf::relation %self class - ::nx::ObjectParameterSlot create ${os}::Object::slot::class \ + -methodname "::nsf::methods::object::class" + #::nx::ObjectParameterSlot create ${os}::Object::slot::class \ -methodname "::nsf::relation %self class" -disposition forward # + # create "superclass" as a ObjectParameterSlot + # + #::nx::RelationSlot create ${os}::Class::slot::superclass -default ${os}::Object + #::nx::ObjectParameterSlot create ${os}::Class::slot::superclass \ + -methodname "::nsf::methods::class::superclass" -default ${os}::Object + ::nx::ObjectParameterSlot create ${os}::Class::slot::superclass \ + -methodname "::nsf::relation %self superclass" -disposition forward -default ${os}::Object + + + # # Define method "guard" for mixin- and filter-slots of Object and Class # ${os}::Object::slot::filter method guard {obj prop filter guard:optional} { @@ -1507,7 +1515,7 @@ set cl [[$origin info class] create $dest -noinit] # class object set obj $cl - $cl superclass [$origin info superclass] + $cl configure -superclass [$origin info superclass] ::nsf::method::assertion $cl class-invar [::nsf::method::assertion $origin class-invar] ::nsf::relation $cl class-filter [::nsf::relation $origin class-filter] ::nsf::relation $cl class-mixin [::nsf::relation $origin class-mixin] @@ -1598,7 +1606,7 @@ set scl [$subclass info superclass] if {[set index [lsearch -exact $scl [::nsf::self]]] != -1} { set scl [lreplace $scl $index $index $newName] - $subclass superclass $scl + $subclass configure -superclass $scl } } } Index: tests/info-method.test =================================================================== diff -u -r1d20679c48b53f85dcfd6d0be12a06c0776e797d -r3b7a544e17d23c11227445e2949b94b953fc312c --- tests/info-method.test (.../info-method.test) (revision 1d20679c48b53f85dcfd6d0be12a06c0776e797d) +++ tests/info-method.test (.../info-method.test) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -69,7 +69,7 @@ ? {::nx::Class info lookup methods -source application} "" set object_methods "alias attribute configure contains copy destroy eval filter forward info method mixin move protected public require volatile" - set class_methods "alias attribute attributes class-object configure contains copy create destroy eval filter forward info method mixin move new protected public require superclass volatile" + set class_methods "alias attribute attributes class-object configure contains copy create destroy eval filter forward info method mixin move new protected public require volatile" ? {lsort [::nx::Object info lookup methods -source baseclasses]} $class_methods ? {lsort [::nx::Class info lookup methods -source baseclasses]} $class_methods @@ -135,8 +135,8 @@ o mixin ::nx::Class ? {o info lookup method bar} "::nsf::classes::nx::Class::bar" ? {o info lookup methods bar} bar - ? {o info lookup methods superclass} "" - ? {o info lookup method superclass} "" + ? {o info lookup methods create} "" + ? {o info lookup method create} "" ? {o bar} Class.bar ? {o method foo {} {return o.foo}} "::o::foo" @@ -149,7 +149,7 @@ ? {lsort [o info methods]} "A foo fwd is x" o method f args ::nx::next - ? {o info lookup methods superclass} "" + ? {o info lookup methods create} "" ? {o info lookup methods filter} "filter" ? {o info lookup method filter} "::nsf::classes::nx::Object::filter" ? {o filter f} "" @@ -210,8 +210,8 @@ Foo class-object mixin delete ::Fly ? {Foo class-object info mixin classes} "::nx::Class" - ? {Foo info lookup methods superclass} "superclass" - ? {Foo info lookup method superclass} "::nsf::classes::nx::Class::superclass" + ? {Foo info lookup methods create} "create" + ? {Foo info lookup method create} "::nsf::classes::nx::Class::create" ? {o mixin ""} "" } @@ -234,7 +234,7 @@ } D create d1 - ? {D info lookup slots} "::nx::Class::slot::object-mixin ::nx::Class::slot::mixin ::nx::Class::slot::superclass ::nx::Class::slot::object-filter ::nx::Class::slot::filter ::nx::Class::slot::attributes ::nx::Object::slot::volatile ::nx::Object::slot::noinit ::nx::Object::slot::class" + ? {D info lookup slots} "::nx::Class::slot::superclass ::nx::Class::slot::object-mixin ::nx::Class::slot::mixin ::nx::Class::slot::object-filter ::nx::Class::slot::filter ::nx::Class::slot::attributes ::nx::Object::slot::volatile ::nx::Object::slot::noinit ::nx::Object::slot::class" ? {D info slots} "::D::slot::b ::D::slot::a2 ::D::slot::c" ? {::nx::Object info method parameter info} "" } @@ -371,8 +371,7 @@ :public method "a c" {d c} {puts "a c"} :create c1 } - nx::Class create D { - :superclass C + nx::Class create D -superclass C { :public method "string length" {s} {puts length} :public method "string compress" {s} {puts compress} :create d1 Index: tests/parameters.test =================================================================== diff -u -r1d20679c48b53f85dcfd6d0be12a06c0776e797d -r3b7a544e17d23c11227445e2949b94b953fc312c --- tests/parameters.test (.../parameters.test) (revision 1d20679c48b53f85dcfd6d0be12a06c0776e797d) +++ tests/parameters.test (.../parameters.test) (revision 3b7a544e17d23c11227445e2949b94b953fc312c) @@ -249,10 +249,10 @@ C create c1 ? {C eval {:objectparameter}} \ - "-object-mixin:alias,arg=::nsf::classes::nx::Object::mixin -mixin:alias {-superclass:alias ::nx::Object} -object-filter:alias,arg=::nsf::classes::nx::Object::filter -filter:alias -attributes:alias -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg {{-class:forward,arg=::nsf::relation %self class}} __initcmd:initcmd,optional" + "{{-superclass:forward,arg=::nsf::relation %self superclass} ::nx::Object} -object-mixin:alias,arg=::nsf::classes::nx::Object::mixin -mixin:alias -object-filter:alias,arg=::nsf::classes::nx::Object::filter -filter:alias -attributes:alias -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -class:alias,arg=::nsf::methods::object::class __initcmd:initcmd,optional" ? {c1 eval {:objectparameter}} \ - "-a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" + "-a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" } ####################################################### @@ -265,13 +265,13 @@ c1 configure -class Object ? {c1 eval :objectparameter} \ - "-volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" + "-volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" Class create D -superclass C -attributes {d:required} D create d1 -d 100 ? {d1 eval :objectparameter} \ - "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" + "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" } ####################################################### @@ -287,27 +287,27 @@ Class create M2 -attributes {b2} D mixin M ? {d1 eval :objectparameter} \ - "-b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" \ + "-b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" \ "mixin added" M mixin M2 ? {d1 eval :objectparameter} \ - "-b2 -b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" \ + "-b2 -b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" \ "transitive mixin added" D mixin "" #we should have again the old interface ? {d1 eval :objectparameter} \ - "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" + "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" C mixin M ? {d1 eval :objectparameter} \ - "-b2 -b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" \ + "-b2 -b -m1 -m2 -d:required -a {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" \ "mixin added" C mixin "" #we should have again the old interface ? {d1 eval :objectparameter} \ - "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias {{-class:forward,arg=::nsf::relation %self class}} -filter:alias __initcmd:initcmd,optional" + "-d:required -a -b:boolean {-c 1} -volatile:alias,noarg -noinit:alias,arg=::nsf::methods::object::noinit,noarg -mixin:alias -class:alias,arg=::nsf::methods::object::class -filter:alias __initcmd:initcmd,optional" } #######################################################