my , a built-in Tcl command, allows one method of an object to invoke another method of the same object.


official reference


my invokes any method, including non-exported methods, defined by current object, i.e., the object that the method which calls my is bound to.

my is actually a separate command that is created in each object's namespace, so it can be invoked from outside the object if you know the name of the namespace or if you use namespace code inside the object to wrap the invocation. This is useful for callbacks like variable traces or bind event handlers, and also for oo::objdefine foward and oo::define forward.

Invoking without my

PYK 2017-06-04:

proc oo::objdefine::baremethod {name args body} {
    set object [lindex [info level -1] 1]
    ::oo::objdefine $object [list method $name $args $body]
    proc [info object namespace $object]::$name args [
        list ::tailcall my $name {*}$args]

A simple example:

::oo::object create o1
::oo::objdefine o1 {
    baremethod m1 {} {
        puts {hello from m1}
    baremethod m2 {} {
        puts {hello from m2}

o1 m2

This works for object systems that use oo::copy and avoid oo::class. Doing the same for objects created via the oo::class mechanism is less feasible.