Each multi dispatch builds a list of candidates, all of which satisfy the nominal type constraints. For a normal sub or method call, the dispatcher invokes the first candidate which passes any additional constraint checks.
A routine can choose to delegate its work to other candidates in that list.
The callsame primitive calls the next candidate, passing along the arguments
received. The callwith primitive calls the next candidate with different
(and provided) arguments. After the called routine has done its work, the
callee can continue its work.
If there's no further work to do, the routine can decide to hand control
completely to the next candidate by calling nextsame or nextwith. The
former reuses the argument list and the latter allows the use of a different
argument list. This delegation is common in object destructors, where each
subclass may perform some cleanup for its own particular data. After it
finishes its work, it can delegate to its parent class meethod by calling
nextsame.