<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Annotation;
use Zend\Code\Annotation\Parser\ParserInterface;
use Zend\EventManager\Event;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
use Zend\EventManager\EventManagerInterface;
/**
* Pluggable annotation manager
*
* Simply composes an EventManager. When createAnnotation() is called, it fires
* off an event of the same name, passing it the resolved annotation class, the
* annotation content, and the raw annotation string; the first listener to
* return an object will halt execution of the event, and that object will be
* returned as the annotation.
*/
class AnnotationManager implements EventManagerAwareInterface
{
const EVENT_CREATE_ANNOTATION = 'createAnnotation';
/**
* @var EventManagerInterface
*/
protected $events;
/**
* Set the event manager instance
*
* @param EventManagerInterface $events
* @return AnnotationManager
*/
public function setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
__CLASS__,
get_class($this),
));
$this->events = $events;
return $this;
}
/**
* Retrieve event manager
*
* Lazy loads an instance if none registered.
*
* @return EventManagerInterface
*/
public function getEventManager()
{
if (null === $this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
/**
* Attach a parser to listen to the createAnnotation event
*
* @param ParserInterface $parser
* @return AnnotationManager
*/
public function attach(ParserInterface $parser)
{
$this->getEventManager()
->attach(self::EVENT_CREATE_ANNOTATION, array($parser, 'onCreateAnnotation'));
return $this;
}
/**
* Create Annotation
*
* @param array $annotationData
* @return false|\stdClass
*/
public function createAnnotation(array $annotationData)
{
$event = new Event();
$event->setName(self::EVENT_CREATE_ANNOTATION);
$event->setTarget($this);
$event->setParams(array(
'class' => $annotationData[0],
'content' => $annotationData[1],
'raw' => $annotationData[2],
));
$eventManager = $this->getEventManager();
$results = $eventManager->trigger($event, function ($r) {
return (is_object($r));
});
$annotation = $results->last();
return (is_object($annotation) ? $annotation : false);
}
}