/** * Gets the service object of the specified type. * @param string service name * @param array options in case service is not singleton * @return mixed */ public static function getService($name, array $options = NULL) { if (!is_string($name) || $name === '') { throw new InvalidArgumentException("Service name must be a non-empty string, " . gettype($name) . " given."); } $session = Environment::getSession('MokujiServiceLocator'); $lower = strtolower($name); if (isset($session->{$lower})) { // instantiated singleton if ($options) { throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options."); } return $session->{$lower}; } elseif (isset($session->factories[$lower])) { list($factory, $singleton, $defOptions) = $session->factories[$lower]; if ($singleton && $options) { throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options."); } elseif ($defOptions) { $options = $options ? $options + $defOptions : $defOptions; } if (is_string($factory) && strpos($factory, ':') === FALSE) { // class name Framework::fixNamespace($factory); if (!class_exists($factory)) { throw new AmbiguousServiceException("Cannot instantiate service '{$name}', class '{$factory}' not found."); } $service = new $factory(); if ($options && method_exists($service, 'setOptions')) { $service->setOptions($options); // TODO: better! } } else { // factory callback $factory = callback($factory); if (!$factory->isCallable()) { throw new InvalidStateException("Cannot instantiate service '{$name}', handler '{$factory}' is not callable."); } $service = $factory->invoke($options); if (!is_object($service)) { throw new AmbiguousServiceException("Cannot instantiate service '{$name}', value returned by '{$factory}' is not object."); } } if ($singleton) { $session->{$lower} = $service; unset($session->factories[$lower]); } return $service; } if ($this->parent !== NULL) { return $this->parent->getService($name, $options); } else { throw new InvalidStateException("Service '{$name}' not found."); } }
/** * Returns mailer. * @return IMailer */ public function getMailer() { if ($this->mailer === NULL) { Framework::fixNamespace(self::$defaultMailer); $this->mailer = is_object(self::$defaultMailer) ? self::$defaultMailer : new self::$defaultMailer(); } return $this->mailer; }
/** * Stops monitoring. * @param string class/interface type * @return void */ public function unmonitor($type) { Framework::fixNamespace($type); unset($this->monitors[$type]); }
/** * Iterates over a components. * @param bool recursive? * @param string class types filter * @return ArrayIterator */ public final function getComponents($deep = FALSE, $filterType = NULL) { $iterator = new RecursiveComponentIterator($this->components); if ($deep) { $deep = $deep > 0 ? RecursiveIteratorIterator::SELF_FIRST : RecursiveIteratorIterator::CHILD_FIRST; $iterator = new RecursiveIteratorIterator($iterator, $deep); } if ($filterType) { Framework::fixNamespace($filterType); $iterator = new InstanceFilterIterator($iterator, $filterType); } return $iterator; }