--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Behat\Snippet;
+
+use Behat\Behat\Context\Snippet\ContextSnippet;
+use Behat\Gherkin\Node\StepNode;
+
+/**
+ * Aggregates multiple similar snippets with different targets and steps.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class AggregateSnippet
+{
+ /**
+ * @var Snippet[]
+ */
+ private $snippets;
+
+ /**
+ * Initializes snippet.
+ *
+ * @param Snippet[] $snippets
+ */
+ public function __construct(array $snippets)
+ {
+ $this->snippets = $snippets;
+ }
+
+ /**
+ * Returns snippet type.
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return current($this->snippets)->getType();
+ }
+
+ /**
+ * Returns snippet unique ID (step type independent).
+ *
+ * @return string
+ */
+ public function getHash()
+ {
+ return current($this->snippets)->getHash();
+ }
+
+ /**
+ * Returns definition snippet text.
+ *
+ * @return string
+ */
+ public function getSnippet()
+ {
+ return current($this->snippets)->getSnippet();
+ }
+
+ /**
+ * Returns all steps interested in this snippet.
+ *
+ * @return StepNode[]
+ */
+ public function getSteps()
+ {
+ return array_unique(
+ array_map(
+ function (Snippet $snippet) {
+ return $snippet->getStep();
+ },
+ $this->snippets
+ ),
+ SORT_REGULAR
+ );
+ }
+
+ /**
+ * Returns all snippet targets.
+ *
+ * @return string[]
+ */
+ public function getTargets()
+ {
+ return array_unique(
+ array_map(
+ function (Snippet $snippet) {
+ return $snippet->getTarget();
+ },
+ $this->snippets
+ )
+ );
+ }
+
+ /**
+ * Returns the classes used in the snippet which should be imported.
+ *
+ * @return string[]
+ */
+ public function getUsedClasses()
+ {
+ if (empty($this->snippets)) {
+ return array();
+ }
+
+ return array_unique(
+ call_user_func_array(
+ 'array_merge',
+ array_map(
+ function (Snippet $snippet) {
+ if (!$snippet instanceof ContextSnippet) {
+ return array();
+ }
+
+ return $snippet->getUsedClasses();
+ },
+ $this->snippets
+ )
+ )
+ );
+ }
+}