Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Component\Annotation;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\NestedArray;
|
Chris@0
|
6
|
Chris@0
|
7 /**
|
Chris@0
|
8 * Defines a Plugin annotation object.
|
Chris@0
|
9 *
|
Chris@0
|
10 * Annotations in plugin classes can use this class in order to pass various
|
Chris@0
|
11 * metadata about the plugin through the parser to
|
Chris@0
|
12 * DiscoveryInterface::getDefinitions() calls. This allows the metadata
|
Chris@0
|
13 * of a class to be located with the class itself, rather than in module-based
|
Chris@0
|
14 * info hooks.
|
Chris@0
|
15 *
|
Chris@0
|
16 * @ingroup plugin_api
|
Chris@0
|
17 *
|
Chris@0
|
18 * @Annotation
|
Chris@0
|
19 */
|
Chris@0
|
20 class Plugin implements AnnotationInterface {
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The plugin definition read from the class annotation.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var array
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $definition;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * Constructs a Plugin object.
|
Chris@0
|
31 *
|
Chris@0
|
32 * Builds up the plugin definition and invokes the get() method for any
|
Chris@0
|
33 * classed annotations that were used.
|
Chris@0
|
34 */
|
Chris@0
|
35 public function __construct($values) {
|
Chris@0
|
36 $reflection = new \ReflectionClass($this);
|
Chris@0
|
37 // Only keep actual default values by ignoring NULL values.
|
Chris@0
|
38 $defaults = array_filter($reflection->getDefaultProperties(), function ($value) {
|
Chris@0
|
39 return $value !== NULL;
|
Chris@0
|
40 });
|
Chris@0
|
41 $parsed_values = $this->parse($values);
|
Chris@0
|
42 $this->definition = NestedArray::mergeDeep($defaults, $parsed_values);
|
Chris@0
|
43 }
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * Parses an annotation into its definition.
|
Chris@0
|
47 *
|
Chris@0
|
48 * @param array $values
|
Chris@0
|
49 * The annotation array.
|
Chris@0
|
50 *
|
Chris@0
|
51 * @return array
|
Chris@0
|
52 * The parsed annotation as a definition.
|
Chris@0
|
53 */
|
Chris@0
|
54 protected function parse(array $values) {
|
Chris@0
|
55 $definitions = [];
|
Chris@0
|
56 foreach ($values as $key => $value) {
|
Chris@0
|
57 if ($value instanceof AnnotationInterface) {
|
Chris@0
|
58 $definitions[$key] = $value->get();
|
Chris@0
|
59 }
|
Chris@0
|
60 elseif (is_array($value)) {
|
Chris@0
|
61 $definitions[$key] = $this->parse($value);
|
Chris@0
|
62 }
|
Chris@0
|
63 else {
|
Chris@0
|
64 $definitions[$key] = $value;
|
Chris@0
|
65 }
|
Chris@0
|
66 }
|
Chris@0
|
67 return $definitions;
|
Chris@0
|
68 }
|
Chris@0
|
69
|
Chris@0
|
70 /**
|
Chris@0
|
71 * {@inheritdoc}
|
Chris@0
|
72 */
|
Chris@0
|
73 public function get() {
|
Chris@0
|
74 return $this->definition;
|
Chris@0
|
75 }
|
Chris@0
|
76
|
Chris@0
|
77 /**
|
Chris@0
|
78 * {@inheritdoc}
|
Chris@0
|
79 */
|
Chris@0
|
80 public function getProvider() {
|
Chris@0
|
81 return isset($this->definition['provider']) ? $this->definition['provider'] : FALSE;
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * {@inheritdoc}
|
Chris@0
|
86 */
|
Chris@0
|
87 public function setProvider($provider) {
|
Chris@0
|
88 $this->definition['provider'] = $provider;
|
Chris@0
|
89 }
|
Chris@0
|
90
|
Chris@0
|
91 /**
|
Chris@0
|
92 * {@inheritdoc}
|
Chris@0
|
93 */
|
Chris@0
|
94 public function getId() {
|
Chris@0
|
95 return $this->definition['id'];
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * {@inheritdoc}
|
Chris@0
|
100 */
|
Chris@0
|
101 public function getClass() {
|
Chris@0
|
102 return $this->definition['class'];
|
Chris@0
|
103 }
|
Chris@0
|
104
|
Chris@0
|
105 /**
|
Chris@0
|
106 * {@inheritdoc}
|
Chris@0
|
107 */
|
Chris@0
|
108 public function setClass($class) {
|
Chris@0
|
109 $this->definition['class'] = $class;
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 }
|