next(3tcl)
β¨ next(3tcl) β TclOO Commands β¨
okay so bestie, you clicked on next(3tcl) and honestly? iconic choice. it's giving TclOO, it's giving method chain realness, and it's literally about invoking superclass method implementations. no cap. π
π NAME π
next, nextto β Invoke superclass method implementations
πΈ SYNOPSIS πΈ
package require tcl::oo
next ?arg ...?
nextto class ?arg ...?
π¦ DESCRIPTION π¦
okay so the next command? it's literally the way you call implementations of a method that come from a class, superclass, or mixin β specifically the ones that are overridden by the current method. you can only use it from inside a method. it's also used inside filters to mark the exact point where a filter calls the actual implementation. and bestie, the filter can decide to not go along the chain at all, and it can process the results of going along the chain of methods however it wants. main character energy.
the result of next is the result of the next method in the method chain. but if there are no further methods in the method chain, the result of next will be an error. the arguments, arg, to next are the arguments you pass to the next method in the chain. periodt.
now nextto? it's the same as next, except it takes an additional class argument. that class identifies a class whose implementation of the current method chain (see info object call) should be used. the method implementation selected will be the one provided by the given class, and it must refer to an existing non-filter invocation that lies further along the chain than the current implementation. iykyk.
π THE METHOD CHAIN π
when a method of an object is invoked, things happen in several stages:
- the structure of the object, its class, superclasses, filters, and mixins, are examined to build a method chain. that chain contains a list of method implementations to invoke.
- the first method implementation on the chain is invoked.
- if that method implementation invokes the
nextcommand, the next method implementation is invoked (with its arguments being those that were passed tonext). - the result from the overall method call is the result from the outermost method implementation. inner method implementations return their results through
next. - the method chain is cached for future use. obsessed.
π METHOD SEARCH ORDER π
when constructing the method chain, method implementations are searched for in the following order:
- in the classes mixed into the object, in class traversal order. the list of mixins is checked in natural order.
- in the classes mixed into the classes of the object, with sources of mixing in being searched in class traversal order. within each class, the list of mixins is processed in natural order.
- in the object itself.
- in the object's class.
- in the superclasses of the class, following each superclass in a depth-first fashion in the natural order of the superclass list.
any particular method implementation always comes as late in the resulting list of implementations as possible. this means that if some class, A, is both mixed into a class, B, and is also a superclass of B, the instances of B will always treat A as a superclass from the perspective of inheritance. this is true even when the multiple inheritance is processed indirectly. slay.
π FILTERS π
when an object has a list of filter names set upon it, or is an instance of a class (or has mixed in a class) that has a list of filter names set upon it, before every invocation of any method the filters are processed. filter implementations are found in class traversal order, as are the lists of filter names (each of which is traversed in natural list order). explicitly invoking a method used as a filter will cause that method to be invoked twice, once as a filter and once as a normal method. not me getting called twice but okay.
each filter should decide for itself whether to permit the execution to go forward to the proper implementation of the method (which it does by invoking the next command as filters are inserted into the front of the method call chain) and is responsible for returning the result of next. highkey important.
filters are invoked when processing an invocation of the unknown method because of a failure to locate a method implementation, but not when invoking either constructors or destructors. (note however that the destroy method is a conventional method, and filters are invoked as normal when it is called.) π
π EXAMPLES π
this example demonstrates how to use the next command to call the (super)class's implementation of a method. the script:
oo::class create theSuperclass {
method example {args} {
puts "in the superclass, args = $args"
}
}
oo::class create theSubclass {
superclass theSuperclass
method example {args} {
puts "before chaining from subclass, args = $args"
next a {*}$args b
next pureSynthesis
puts "after chaining from subclass"
}
}
theSubclass create obj
oo::objdefine obj method example args {
puts "per-object method, args = $args"
next x {*}$args y
next
}
obj example 1 2 3
prints the following:
per-object method, args = 1 2 3
before chaining from subclass, args = x 1 2 3 y
in the superclass, args = a x 1 2 3 y b
in the superclass, args = pureSynthesis
after chaining from subclass
before chaining from subclass, args =
in the superclass, args = a b
in the superclass, args = pureSynthesis
after chaining from subclass
this example demonstrates how to build a simple cache class that applies memoization to all the method calls of the objects it is mixed into, and shows how it can make a difference to computation times:
oo::class create cache {
filter Memoize
method Memoize args {
# Do not filter the core method implementations
if {[lindex [self target] 0] eq "::oo::object"} {
return [next {*}$args]
}
# Check if the value is already in the cache
my variable ValueCache
set key [self target],$args
if {[info exist ValueCache($key)]} {
return $ValueCache($key)
}
# Compute value, insert into cache, and return it
return [set ValueCache($key) [next {*}$args]]
}
method flushCache {} {
my variable ValueCache
unset ValueCache
# Skip the caching
return -level 2 ""
}
}
oo::object create demo
oo::objdefine demo {
mixin cache
method compute {a b c} {
after 3000 ;# Simulate deep thought
return [expr {$a + $b * $c}]
}
method compute2 {a b c} {
after 3000 ;# Simulate deep thought
return [expr {$a * $b + $c}]
}
}
puts [demo compute 1 2 3] β prints "7" after delay
puts [demo compute2 4 5 6] β prints "26" after delay
puts [demo compute 1 2 3] β prints "7" instantly
puts [demo compute2 4 5 6] β prints "26" instantly
puts [demo compute 4 5 6] β prints "34" after delay
puts [demo compute 4 5 6] β prints "34" instantly
puts [demo compute 1 2 3] β prints "7" instantly
demo flushCache
puts [demo compute 1 2 3] β prints "7" after delay
π SEE ALSO π
oo::class(3tcl)oo::define(3tcl)oo::object(3tcl)self(3tcl)
π KEYWORDS π
call, method, method chain
and that's the whole vibe bestie! this manual page is from TclOO, version 0.1, and it's literally the next(3tcl) page. no date on the footer, just that iconic 0.1 energy. slay. π
β¨
π¦ where this page comes from
- ubuntu stonking: tcl9.0-doc 9.0.4+dfsg-1
- Copyright (c) 2007 Donal K. Fellows
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms