Based on your input, I have created a proc to simplify the entire process:
#Create a proc ::nx::clone in order to put the NX OO system under a private #namespace, so that the ::nx namespace doesn't get polluted with custom methods. #It also allows further unlimited cloning into other namespaces, where the custom #methods are inherited down the line. ############################################################### proc ::nx::clone {ns {nsbody ""}} { set cns [namespace current]; if {![regexp ^:: $ns]} { set ns ::$ns; };
namespace eval $ns $nsbody;
${cns}::Class create ${ns}::Object -superclasses ${cns}::Object; ${cns}::Class create ${ns}::Class -superclasses ${cns}::Class { upvar cns cns upvar ns ns ::nx::slotObj [self]; ::nx::ObjectParameterSlot create [self]::slot::superclasses \ -methodname "::nsf::methods::class::superclass" \ -elementtype class -multiplicity 1..n \ -default ${ns}::Object }; proc ${ns}::clone {ns {nsbody ""}} [info body ::nx::clone]; namespace eval $ns {namespace export Object Class}; return $ns; };
################################################################## ::nx::clone ::my {puts "you could put your custom package code here"};
::my::Object public method mymethod {} {puts "hello from mymethod in [:], it will be inherited by the next clone"}; ::my::Class create ::MyClass; ::MyClass create myobject; ::myobject mymethod;
::my::clone ::your;
::your::Class create YourClass; ::your::Object create yourobject; ::YourClass create yourobject1; ::yourobject mymethod; ::yourobject1 mymethod;
On Tue, Jan 20, 2015 at 12:21 PM, Gustaf Neumann neumann@wu.ac.at wrote:
Dear Victor,
below is a small improvement for the working suggestion:
the first suggestion used the constructor to fix the superclass
it is better, the change the default of the "superclasses" slot (inherited from nx::Class) from "nx::Object" to "nx::Class"
this is a slot, that is not linked to a variable, but to a method altering the class. Therefore the definition of this slot is slightly more magic.
This solution has the advantage, that one has not to care that further specializations of my::Class call in their constructor always "next". Furthermore, it should be slightly faster.
all the best -gn
namespace eval my {
Class create Object -superclasses nx::Object
Class create Class -superclasses nx::Class {
# create a slot container ... ::nx::slotObj [self] # ... and redefine slot "superclasses" with a different default # value, such we can write # # my::Class create Foo # # instead of # # my::Class create Foo -superclasses ::my::Object # ::nx::ObjectParameterSlot create [self]::slot::superclasses \ -methodname "::nsf::methods::class::superclass" \ -elementtype class -multiplicity 1..n \ -default [namespace current]::Object
}
namespace export Object Class }
# # show parameter definition of "superclasses" with changed default # puts "parameter definition for '-superclasses': [my::Class info lookup parameters create super*]"
Am 20.01.15 um 11:28 schrieb Victor Mayevski:
That's beautiful! Thank you!
On Tue, Jan 20, 2015 at 1:11 AM, Stefan Sobernig < stefan.sobernig@wu.ac.at> wrote:
A more complete solution (preserving any pre-existing superclass lists) is as follows:
package req nx
namespace eval ::vitick {
Class create Object -superclasses nx::Object
Class create Class -superclasses nx::Class { :method init {} { ## ## Rewire the default superclass ## if {[:info superclasses] eq "::nx::Object"} { :configure -superclasses [namespace current]::Object }
}
}
namespace export Object Class }
namespace import -force ::vitick::*
puts [[Class create MyClass] info superclasses]; # default is: ::vitick::Object puts [[Class create AnotherClass -superclasses MyClass] info superclasses]; # ::MyClass puts [[Class create AnotherClass -superclasses MyClass] info superclasses -closure]; # ::MyClass ::vitick::Object ::nx::Object
//stefan
Hi Victor,
Any suggestions?
As always, there are several options. One way of nursing our custom Object/Class is to use proper specializations of nx::Object/nx::Class:
package req nx
namespace eval ::vitick {
Class create Object -superclass nx::Object
Class create Class -superclass nx::Class { :method init {} { :configure -superclasses [namespace current]::Object } }
namespace export Object Class }
namespace import -force ::vitick::*
This is less invasive and you have the benefit of monitoring any changes/additions to nx::Object/nx::Class for free.
Cheers, Stefan _______________________________________________