#$Id: composite.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $
Class Composite -superclass Class
Composite metadata add description
@ @File {
  description {
  Simple composite pattern meta-class taken from the paper 
  'Filters as a Language Support for Design Patterns in
  Object-Oriented Scripting Languages'. 
  }
}

Composite instproc addOperations args {
  foreach op $args {
    if {![my exists operations($op)]} {
      my set operations($op) $op
    }
  }
} 

Composite instproc removeOperations args {
  foreach op $args {
    if {![my exists operations($op)]} {
      my unset operations($op)
    }
  }
}

Composite instproc compositeFilter args {
  # get the operations class variable from the object's class
  set registrationclass [lindex [self filterreg] 0]
  $registrationclass instvar operations
  # get the request
  set r [self calledproc]
  puts ***compositeFilter--${r}--[self]

  # check if the request is a registered operation 
  if {[info exists operations($r)]} {
    foreach object [my info children] {
      # forward request
      eval $object $r $args
    }
  }
  return [next]    
}


Composite instproc init {args} {
  my array set operations {}
  next
  my instfilterappend compositeFilter 
}


