Hi,
I use ActiveState Tcl 8.6.0.0.295132 Beta 6. The following code:
package require TclOO
oo::class create Mix1 \
{
variable Mix1_var
constructor {} \
{
set Mix1_var 10
puts "Mix1 constructor: Mix1_var = $Mix1_var."
next
}
}
oo::class create C1 \
{
mixin [oo::copy Mix1 Mix1_copy]
variable C1_var
constructor {} \
{
set C1_var 40
my variable Mix1_var ;# needed otherwise variable not found (normal behavior)
puts "C1 constructor: C1_var = $C1_var and Mix1_var = $Mix1_var."
}
}
C1 create objc1
gives the output:
Mix1 constructor: Mix1_var = 10.
can't read "Mix1_var": no such variable
% puts $errorInfo
can't read "Mix1_var": no such variable
while executing
"puts "C1 constructor: C1_var = $C1_var and Mix1_var = $Mix1_var.""
(class "::C1" constructor line 4)
invoked from within
"next"
(class "::oo::define::Mix1_copy" constructor line 4)
invoked from within
"C1 create objc1"
However, if:
mixin [oo::copy Mix1 Mix1_copy]
is replaced by:
mixin Mix1
then it works without an error. So I suspect variables in a mixin not being copied when the mixin class is copied. Please confirm if it is a bug.
Thanks,
Etienne
Unidiff
Try the attached patch (or look on the development-rfe3485060 of the tcloo project: http://core.tcl.tk/tcloo/\) which should now copy variables and procedures. I'd appreciate review; there may be things that should be copied by default which I've forgotten. (Note that non-procedure commands and sub-namespaces will definitely _not_ be copied by default, the former because that's super-hard and the latter because there's now a mechanism for adding it when necessary. I also don't copy traces of any kind.)
It's *possible* that the patch won't apply cleanly to the main Tcl 8.6 trunk right now (well, excluding the ChangeLog entry of course). The codebases are close, but not identical.
Fixed with commit of TIP #397 implementation,