Chain-of-responsibility: "Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it."
package require snit snit::type handler { option -handleIf variable condition false onconfigure -handleIf value {set condition $value} option -handleBy variable consequent {} onconfigure -handleBy value {set consequent $value} option -elseReportTo variable alternative {} onconfigure -elseReportTo value { set alternative [concat $value handle \$request] } method handle request { if $condition $consequent $alternative } }
Example:
proc main args { handler Tom -handleIf { $request >= 0 && $request < 10 } -handleBy { puts "$self handled request $request" } -elseReportTo Gus handler Gus -handleIf { $request >= 10 && $request < 20 } -handleBy { puts "$self handled request $request" } -elseReportTo Mary handler Mary -handleIf { $request >= 20 && $request < 30 } -handleBy { puts "$self handled request $request" } foreach request [list 2 5 14 22 18 38 3 27 20] { Tom handle $request } }