protected function simulate(Quackable $duck = NULL)
 {
     if ($duck == NULL) {
         $mallardDuck = new MallardDuck();
         $redheadDuck = new RedheadDuck();
         $duckCall = new DuckCall();
         $rubberDuck = new RubberDuck();
         println("\nDuck Simulator");
         $this->simulate($mallardDuck);
         $this->simulate($redheadDuck);
         $this->simulate($duckCall);
         $this->simulate($rubberDuck);
     } else {
         $duck->quack();
     }
 }
 protected function simulate(Quackable $duck = NULL)
 {
     if ($duck == NULL) {
         $mallardDuck = new QuackCounter(new MallardDuck());
         $redheadDuck = new QuackCounter(new RedheadDuck());
         $duckCall = new QuackCounter(new DuckCall());
         $rubberDuck = new QuackCounter(new RubberDuck());
         $gooseDuck = new GooseAdapter(new Goose());
         println("\nDuck Simulator: With Decorator");
         $this->simulate($mallardDuck);
         $this->simulate($redheadDuck);
         $this->simulate($duckCall);
         $this->simulate($rubberDuck);
         $this->simulate($gooseDuck);
         println("The ducks quacked " . QuackCounter::getQuacks() . " times");
     } else {
         $duck->quack();
     }
 }
 public function __toString()
 {
     return $this->duck->__toString();
 }