--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat Gherkin.
+ * (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\Gherkin\Node;
+
+/**
+ * Represents Gherkin Outline.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class OutlineNode implements ScenarioInterface
+{
+ /**
+ * @var string
+ */
+ private $title;
+ /**
+ * @var string[]
+ */
+ private $tags;
+ /**
+ * @var StepNode[]
+ */
+ private $steps;
+ /**
+ * @var ExampleTableNode
+ */
+ private $table;
+ /**
+ * @var string
+ */
+ private $keyword;
+ /**
+ * @var integer
+ */
+ private $line;
+ /**
+ * @var null|ExampleNode[]
+ */
+ private $examples;
+
+ /**
+ * Initializes outline.
+ *
+ * @param null|string $title
+ * @param string[] $tags
+ * @param StepNode[] $steps
+ * @param ExampleTableNode $table
+ * @param string $keyword
+ * @param integer $line
+ */
+ public function __construct(
+ $title,
+ array $tags,
+ array $steps,
+ ExampleTableNode $table,
+ $keyword,
+ $line
+ ) {
+ $this->title = $title;
+ $this->tags = $tags;
+ $this->steps = $steps;
+ $this->table = $table;
+ $this->keyword = $keyword;
+ $this->line = $line;
+ }
+
+ /**
+ * Returns node type string
+ *
+ * @return string
+ */
+ public function getNodeType()
+ {
+ return 'Outline';
+ }
+
+ /**
+ * Returns outline title.
+ *
+ * @return null|string
+ */
+ public function getTitle()
+ {
+ return $this->title;
+ }
+
+ /**
+ * Checks if outline is tagged with tag.
+ *
+ * @param string $tag
+ *
+ * @return Boolean
+ */
+ public function hasTag($tag)
+ {
+ return in_array($tag, $this->getTags());
+ }
+
+ /**
+ * Checks if outline has tags (both inherited from feature and own).
+ *
+ * @return Boolean
+ */
+ public function hasTags()
+ {
+ return 0 < count($this->getTags());
+ }
+
+ /**
+ * Returns outline tags (including inherited from feature).
+ *
+ * @return string[]
+ */
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ /**
+ * Checks if outline has steps.
+ *
+ * @return Boolean
+ */
+ public function hasSteps()
+ {
+ return 0 < count($this->steps);
+ }
+
+ /**
+ * Returns outline steps.
+ *
+ * @return StepNode[]
+ */
+ public function getSteps()
+ {
+ return $this->steps;
+ }
+
+ /**
+ * Checks if outline has examples.
+ *
+ * @return Boolean
+ */
+ public function hasExamples()
+ {
+ return 0 < count($this->table->getColumnsHash());
+ }
+
+ /**
+ * Returns examples table.
+ *
+ * @return ExampleTableNode
+ */
+ public function getExampleTable()
+ {
+ return $this->table;
+ }
+
+ /**
+ * Returns list of examples for the outline.
+ *
+ * @return ExampleNode[]
+ */
+ public function getExamples()
+ {
+ return $this->examples = $this->examples ? : $this->createExamples();
+ }
+
+ /**
+ * Returns outline keyword.
+ *
+ * @return string
+ */
+ public function getKeyword()
+ {
+ return $this->keyword;
+ }
+
+ /**
+ * Returns outline declaration line number.
+ *
+ * @return integer
+ */
+ public function getLine()
+ {
+ return $this->line;
+ }
+
+ /**
+ * Creates examples for this outline using examples table.
+ *
+ * @return ExampleNode[]
+ */
+ protected function createExamples()
+ {
+ $examples = array();
+ foreach ($this->table->getColumnsHash() as $rowNum => $row) {
+ $examples[] = new ExampleNode(
+ $this->table->getRowAsString($rowNum + 1),
+ $this->tags,
+ $this->getSteps(),
+ $row,
+ $this->table->getRowLine($rowNum + 1),
+ $this->getTitle()
+ );
+ }
+
+ return $examples;
+ }
+}