oo::copy — create copies of objects and classes
package require tcl::oo
oo::copy sourceObject ?targetObject?
?targetNamespace?
The oo::copy command creates a copy of an object or class.
It takes the name of the object or class to be copied,
sourceObject, and optionally the name of the object or class
to create, targetObject, which will be resolved relative to
the current namespace if not an absolute qualified name and
targetNamespace which is the name of the namespace that will
hold the internal state of the object (my command, etc.); it must not
refer to an existing namespace. If either targetObject or
targetNamespace is omitted or is given as the empty string,
a new name is chosen. Names, unless specified, are chosen with the
same algorithm used by the new method of oo::class. The copied object will be
of the same class as the source object, and will have all its
per-object methods copied. If it is a class, it will also have all
the class methods in the class copied, but it will not have any of
its instances copied.
After the targetObject has been created and all
definitions of its configuration (e.g., methods, filters, mixins)
copied, the <cloned> method of targetObject
will be invoked, to allow for customization of the created object
such as installing related variable traces. The only argument given
will be sourceObject. The default implementation of this
method (in oo::object)
just copies the procedures and variables in the namespace of
sourceObject to the namespace of targetObject. If
this method call does not return a result that is successful (i.e.,
an error or other kind of exception) then the targetObject
will be deleted and an error returned.
The result of the oo::copy command will be the
fully-qualified name of the new object or class.
This example creates an object, copies it, modifies the source
object, and then demonstrates that the copied object is indeed a
copy.
oo::object create src
oo::objdefine src method msg {} {puts foo}
oo::copy src dst
oo::objdefine src method msg {} {puts bar}
src msg → prints "bar"
dst msg → prints "foo"
oo::class, oo::define, oo::object
clone, copy, duplication, object
Copyright © 2007 Donal K. Fellows