config[self::MAX_ATTEMPTS]) ? $this->config[self::MAX_ATTEMPTS] : 10; } /** * Get the amount of time in seconds to delay between attempts * * @return int */ public function getInterval() { return isset($this->config[self::INTERVAL]) ? $this->config[self::INTERVAL] : 0; } /** * {@inheritdoc} */ public function setMaxAttempts($maxAttempts) { $this->config[self::MAX_ATTEMPTS] = $maxAttempts; return $this; } /** * {@inheritdoc} */ public function setInterval($interval) { $this->config[self::INTERVAL] = $interval; return $this; } /** * Set config options associated with the waiter * * @param array $config Options to set * * @return self */ public function setConfig(array $config) { $this->config = $config; return $this; } /** * {@inheritdoc} */ public function wait() { $this->attempts = 0; do { $this->dispatch('waiter.before_attempt', array( 'waiter' => $this, 'config' => $this->config, )); if ($this->doWait()) { break; } if (++$this->attempts >= $this->getMaxAttempts()) { throw new RuntimeException('Wait method never resolved to true after ' . $this->attempts . ' attempts'); } $this->dispatch('waiter.before_wait', array( 'waiter' => $this, 'config' => $this->config, )); if ($this->getInterval()) { usleep($this->getInterval() * 1000000); } } while (1); } /** * Method to implement in subclasses * * @return bool Return true when successful, false on failure */ abstract protected function doWait(); }