Provided by: tcl8.6-doc_8.6.8+dfsg-3_all bug

NAME

       next, nextto - invoke superclass method implementations

SYNOPSIS

       package require TclOO

       next ?arg ...?
       nextto class ?arg ...?
________________________________________________________________________________________________________________

DESCRIPTION

       The  next  command  is  used to call implementations of a method by a class, superclass or mixin that are
       overridden by the current method. It can only be used from within  a  method.  It  is  also  used  within
       filters  to  indicate  the point where a filter calls the actual implementation (the filter may decide to
       not go along the chain, and may process the results of going along the chain of methods as  it  chooses).
       The  result  of  the  next  command is the result of the next method in the method chain; 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 to pass to the next method in the chain.

       The  nextto  command  is  the same as the next command, except that it takes an additional class argument
       that 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.

THE METHOD CHAIN

       When a method of an object is invoked, things happen in several stages:

       [1]    The structure of the object, its class, superclasses, filters, and mixins, are examined to build a
              method chain, which contains a list of method implementations to invoke.

       [2]    The first method implementation on the chain is invoked.

       [3]    If  that method implementation invokes the next command, the next method implementation is invoked
              (with its arguments being those that were passed to next).

       [4]    The result from the overall method call is the result from the  outermost  method  implementation;
              inner method implementations return their results through next.

       [5]    The method chain is cached for future use.

   METHOD SEARCH ORDER
       When constructing the method chain, method implementations are searched for in the following order:

       [1]    In  the  classes mixed into the object, in class traversal order. The list of mixins is checked in
              natural order.

       [2]    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.

       [3]    In the object itself.

       [4]    In the object's class.

       [5]    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.

   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.

       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.

       Filters  are invoked when processing an invokation 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