Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Component\Plugin;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * Defines an object which stores multiple plugin instances to lazy load them.
|
Chris@0
|
7 *
|
Chris@0
|
8 * @ingroup plugin_api
|
Chris@0
|
9 */
|
Chris@0
|
10 abstract class LazyPluginCollection implements \IteratorAggregate, \Countable {
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * Stores all instantiated plugins.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @var array
|
Chris@0
|
16 */
|
Chris@0
|
17 protected $pluginInstances = [];
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Stores the IDs of all potential plugin instances.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @var array
|
Chris@0
|
23 */
|
Chris@0
|
24 protected $instanceIDs = [];
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * Initializes and stores a plugin.
|
Chris@0
|
28 *
|
Chris@0
|
29 * @param string $instance_id
|
Chris@0
|
30 * The ID of the plugin instance to initialize.
|
Chris@0
|
31 */
|
Chris@0
|
32 abstract protected function initializePlugin($instance_id);
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * Gets the current configuration of all plugins in this collection.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @return array
|
Chris@0
|
38 * An array of up-to-date plugin configuration.
|
Chris@0
|
39 */
|
Chris@0
|
40 abstract public function getConfiguration();
|
Chris@0
|
41
|
Chris@0
|
42 /**
|
Chris@0
|
43 * Sets the configuration for all plugins in this collection.
|
Chris@0
|
44 *
|
Chris@0
|
45 * @param array $configuration
|
Chris@0
|
46 * An array of up-to-date plugin configuration.
|
Chris@0
|
47 *
|
Chris@0
|
48 * @return $this
|
Chris@0
|
49 */
|
Chris@0
|
50 abstract public function setConfiguration($configuration);
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * Clears all instantiated plugins.
|
Chris@0
|
54 */
|
Chris@0
|
55 public function clear() {
|
Chris@0
|
56 $this->pluginInstances = [];
|
Chris@0
|
57 }
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * Determines if a plugin instance exists.
|
Chris@0
|
61 *
|
Chris@0
|
62 * @param string $instance_id
|
Chris@0
|
63 * The ID of the plugin instance to check.
|
Chris@0
|
64 *
|
Chris@0
|
65 * @return bool
|
Chris@0
|
66 * TRUE if the plugin instance exists, FALSE otherwise.
|
Chris@0
|
67 */
|
Chris@0
|
68 public function has($instance_id) {
|
Chris@0
|
69 return isset($this->pluginInstances[$instance_id]) || isset($this->instanceIDs[$instance_id]);
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 /**
|
Chris@0
|
73 * Gets a plugin instance, initializing it if necessary.
|
Chris@0
|
74 *
|
Chris@0
|
75 * @param string $instance_id
|
Chris@0
|
76 * The ID of the plugin instance being retrieved.
|
Chris@0
|
77 */
|
Chris@0
|
78 public function &get($instance_id) {
|
Chris@0
|
79 if (!isset($this->pluginInstances[$instance_id])) {
|
Chris@0
|
80 $this->initializePlugin($instance_id);
|
Chris@0
|
81 }
|
Chris@0
|
82 return $this->pluginInstances[$instance_id];
|
Chris@0
|
83 }
|
Chris@0
|
84
|
Chris@0
|
85 /**
|
Chris@0
|
86 * Stores an initialized plugin.
|
Chris@0
|
87 *
|
Chris@0
|
88 * @param string $instance_id
|
Chris@0
|
89 * The ID of the plugin instance being stored.
|
Chris@0
|
90 * @param mixed $value
|
Chris@0
|
91 * An instantiated plugin.
|
Chris@0
|
92 */
|
Chris@0
|
93 public function set($instance_id, $value) {
|
Chris@0
|
94 $this->pluginInstances[$instance_id] = $value;
|
Chris@0
|
95 $this->addInstanceId($instance_id);
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * Removes an initialized plugin.
|
Chris@0
|
100 *
|
Chris@0
|
101 * The plugin can still be used; it will be reinitialized.
|
Chris@0
|
102 *
|
Chris@0
|
103 * @param string $instance_id
|
Chris@0
|
104 * The ID of the plugin instance to remove.
|
Chris@0
|
105 */
|
Chris@0
|
106 public function remove($instance_id) {
|
Chris@0
|
107 unset($this->pluginInstances[$instance_id]);
|
Chris@0
|
108 }
|
Chris@0
|
109
|
Chris@0
|
110 /**
|
Chris@0
|
111 * Adds an instance ID to the available instance IDs.
|
Chris@0
|
112 *
|
Chris@0
|
113 * @param string $id
|
Chris@0
|
114 * The ID of the plugin instance to add.
|
Chris@0
|
115 * @param array|null $configuration
|
Chris@0
|
116 * (optional) The configuration used by this instance. Defaults to NULL.
|
Chris@0
|
117 */
|
Chris@0
|
118 public function addInstanceId($id, $configuration = NULL) {
|
Chris@0
|
119 if (!isset($this->instanceIDs[$id])) {
|
Chris@0
|
120 $this->instanceIDs[$id] = $id;
|
Chris@0
|
121 }
|
Chris@0
|
122 }
|
Chris@0
|
123
|
Chris@0
|
124 /**
|
Chris@0
|
125 * Gets all instance IDs.
|
Chris@0
|
126 *
|
Chris@0
|
127 * @return array
|
Chris@0
|
128 * An array of all available instance IDs.
|
Chris@0
|
129 */
|
Chris@0
|
130 public function getInstanceIds() {
|
Chris@0
|
131 return $this->instanceIDs;
|
Chris@0
|
132 }
|
Chris@0
|
133
|
Chris@0
|
134 /**
|
Chris@0
|
135 * Removes an instance ID.
|
Chris@0
|
136 *
|
Chris@0
|
137 * @param string $instance_id
|
Chris@0
|
138 * The ID of the plugin instance to remove.
|
Chris@0
|
139 */
|
Chris@0
|
140 public function removeInstanceId($instance_id) {
|
Chris@0
|
141 unset($this->instanceIDs[$instance_id]);
|
Chris@0
|
142 $this->remove($instance_id);
|
Chris@0
|
143 }
|
Chris@0
|
144
|
Chris@0
|
145 public function getIterator() {
|
Chris@0
|
146 $instances = [];
|
Chris@0
|
147 foreach ($this->getInstanceIds() as $instance_id) {
|
Chris@0
|
148 $instances[$instance_id] = $this->get($instance_id);
|
Chris@0
|
149 }
|
Chris@0
|
150 return new \ArrayIterator($instances);
|
Chris@0
|
151 }
|
Chris@0
|
152
|
Chris@0
|
153 /**
|
Chris@0
|
154 * {@inheritdoc}
|
Chris@0
|
155 */
|
Chris@0
|
156 public function count() {
|
Chris@0
|
157 return count($this->instanceIDs);
|
Chris@0
|
158 }
|
Chris@0
|
159
|
Chris@0
|
160 }
|