public function registerObserver(Observer $observer)
 {
     $iterator = $this->ducks->iterator();
     while ($iterator->hasNext()) {
         $duck = $iterator->next();
         $duck->registerObserver($observer);
     }
 }
 public function quack()
 {
     $iterator = $this->quackers->iterator();
     while ($iterator->hasNext()) {
         $quacker = $iterator->next();
         $quacker->quack();
     }
 }
 public function myPrint()
 {
     print "\n" . $this->getName();
     println(", " . $this->getDescription());
     println("---------------------");
     $iterator = $this->menuComponents->iterator();
     while ($iterator->hasNext()) {
         $menuComponent = $iterator->next();
         $menuComponent->myPrint();
     }
 }
 public function printMenu(MyIterator $iterator = NULL)
 {
     if ($iterator == NULL) {
         $menuIterator = $this->menus->iterator();
         while ($menuIterator->hasNext()) {
             $menu = $menuIterator->next();
             printMenu($menu->createIterator());
         }
     } else {
         while ($iterator->hasNext()) {
             $menuItem = $iterator->next();
             print $menuItem->getName() . ", ";
             print $menuItem->getPrice() . " -- ";
             println($menuItem->getDescription());
         }
     }
 }
 public function getObservers()
 {
     return $this->observers->iterator();
 }
 public function createIterator()
 {
     return $this->menuItems->iterator();
 }