Version 1
[yaffs-website] / vendor / drush / drush / lib / Drush / Drupal / FindCommandsCompilerPass.php
diff --git a/vendor/drush/drush/lib/Drush/Drupal/FindCommandsCompilerPass.php b/vendor/drush/drush/lib/Drush/Drupal/FindCommandsCompilerPass.php
new file mode 100644 (file)
index 0000000..b1e515d
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+namespace Drush\Drupal;
+
+use Drush\Log\LogLevel;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * This compiler pass is added to Drupal's ContainerBuilder by our own
+ * subclass of DrupalKernel.  Our DrupalKernel subclass knows which
+ * compiler passes to add because they are registered to it via its
+ * 'alter()' method. This happens in DrupalBoot8 immediately after the
+ * DrupalKernel object is created.
+ *
+ * Having been thus added, this compiler pass will then be called during
+ * $kernel->boot(), when Drupal's dependency injection container is being
+ * compiled.  Since we cannot use the container at this point (since its
+ * initialization is not yet complete), we instead alter the definition of
+ * a storage class in the container to add more setter injection method
+ * calls to 'addCommandReference'.
+ *
+ * Later, after the container has been completely initialized, we can
+ * fetch the storage class from the DI container (perhaps also via
+ * injection from a reference in the container).  At that point, we can
+ * request the list of Console commands that were added via the
+ * (delayed) call(s) to addCommandReference.
+ *
+ * Documentation:
+ *
+ * http://symfony.com/doc/2.7/components/dependency_injection/tags.html#create-a-compilerpass
+ */
+class FindCommandsCompilerPass implements CompilerPassInterface
+{
+    protected $storageClassId;
+    protected $tagId;
+
+    public function __construct($storageClassId, $tagId)
+    {
+        $this->storageClassId = $storageClassId;
+        $this->tagId = $tagId;
+    }
+
+    public function process(ContainerBuilder $container)
+    {
+        drush_log(dt("process !storage !tag", ['!storage' => $this->storageClassId, '!tag' => $this->tagId]), LogLevel::DEBUG);
+        // We expect that our called registered the storage
+        // class under the storage class id before adding this
+        // compiler pass, but we will test this presumption to be sure.
+        if (!$container->has($this->storageClassId)) {
+            drush_log(dt("storage class not registered"), LogLevel::DEBUG);
+            return;
+        }
+
+        $definition = $container->findDefinition(
+            $this->storageClassId
+        );
+
+        $taggedServices = $container->findTaggedServiceIds(
+            $this->tagId
+        );
+        foreach ($taggedServices as $id => $tags) {
+            drush_log(dt("found tagged service !id", ['!id' => $id]), LogLevel::DEBUG);
+            $definition->addMethodCall(
+                'addCommandReference',
+                array(new Reference($id))
+            );
+        }
+    }
+}