; abstract protected function getDocs(): Vector<(string, string)>; protected function getDescription(): ?string { return null; } final protected function getTitle(): string { return $this->getName().' - Hack Cookbook'; } final protected function renderMainColumn(): :xhp { $main_column =

{$this->getName()}

; $description = $this->getDescription(); if ($description !== null) { $main_column->appendChild(

{$description}

); } foreach ($this->getFilenames() as $filename) { $file =
{$filename}
; $main_column->appendChild($file); } $recipe = $this; if ($recipe instanceof RecipeWithDemo) { try { $result = $recipe->getDemoResult(); } catch (Exception $e) { $result = sprintf( "Demo threw an %s:\n%s", get_class($e), $e->getMessage(), ); } $result = explode("\n", trim($result)); $result = array_map($x ==> {$x}
, $result); $demo =

Demo

{$recipe->getDemoXHP()}
{$recipe->getDemoFilename()}
getDemoFilename()}/>
Output
{$result}
; $main_column->appendChild($demo); } if (!$this->getDocs()->isEmpty()) { $render_doc_link = function($doc) { list($name, $link) = $doc; $link = "http://hhvm.com/manual/en/$link.php"; return
  • {$name}
  • ; }; $main_column->appendChild(

    Relevant Official Documentation

    ); } return $main_column; } }