This repository was archived by the owner on Jan 29, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathAnnotationManager.php
102 lines (87 loc) · 2.7 KB
/
AnnotationManager.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2016 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;
use function get_class;
use function is_object;
/**
* 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;
/**
* {@inheritDoc}
*/
public function setEventManager(EventManagerInterface $events) : self
{
$events->setIdentifiers([
__CLASS__,
get_class($this),
]);
$this->events = $events;
return $this;
}
/**
* {@inheritDoc}
*/
public function getEventManager() : EventManagerInterface
{
if (null === $this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
/**
* Attach a parser to listen to the createAnnotation event
*/
public function attach(ParserInterface $parser) : self
{
$this->getEventManager()
->attach(self::EVENT_CREATE_ANNOTATION, [$parser, 'onCreateAnnotation']);
return $this;
}
/**
* Create Annotation
*
* @param string[] $annotationData
* @return false|\stdClass
*/
public function createAnnotation(array $annotationData)
{
$event = new Event();
$event->setName(self::EVENT_CREATE_ANNOTATION);
$event->setTarget($this);
$event->setParams([
'class' => $annotationData[0],
'content' => $annotationData[1],
'raw' => $annotationData[2],
]);
$eventManager = $this->getEventManager();
$results = $eventManager->triggerEventUntil(function ($r) {
return is_object($r);
}, $event);
$annotation = $results->last();
return is_object($annotation) ? $annotation : false;
}
}