Version 1 of Snit design patterns

Updated 2003-08-16 22:27:47

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
         }
 }