Posted to tcl by cchase at Fri May 27 19:34:20 GMT 2022view pretty

oo::class create Person {
    variable Name Age

    method MethodChaining {args} {
        lassign [self target] className methodName
        puts "$className :: $methodName"
        lassign [info class definition $className $methodName] methodArgs

        if {[llength $args] == 0} {
            return [next]
        } elseif {$methodArgs eq "args"} {
            puts "Target method takes unlimited args."
            return [next {*}$args]
        } else {
            set numMethodArgs [llength $methodArgs]

            set targetArgs [lrange $args 0 $numMethodArgs-1]
            set argsToForward [lrange $args $numMethodArgs end]
            puts "targetArgs: $targetArgs"
            puts "argsToForward: $argsToForward"
            next $targetArgs
            
            if {[llength $argsToForward] != 0} {
                my {*}$argsToForward            
            }
            
            
        }
        
    }

    method multi {args} {
        puts "Hello $args"
    }

    method setName {name} {
        puts "Name set to $name"
        set Name $name
        
    }

    method setAge {age} {
        puts "Age set to $age"
        set Age $age
        
    }

    method details {} {

        puts "$Name is $Age years old"
    }

    filter MethodChaining
}

Person create guy

guy setName Bob setAge 33 details

# Breaks with
# wrong # args: should be "my setAge age"
# which appear to be due to methods being invoked within a Filter method not
# invoking the Filter itself?