Skip to content

Instantly share code, notes, and snippets.

@mageekguy
Last active August 29, 2015 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mageekguy/f96066782bf2d742e75b to your computer and use it in GitHub Desktop.
Save mageekguy/f96066782bf2d742e75b to your computer and use it in GitHub Desktop.
An east pizza!
<?php
namespace world;
use
cli
;
abstract class human
{
private
$name,
$console
;
function __construct(cli\data $name, cli\console $console)
{
$this->name = $name;
$this->console = $console;
}
protected function say(cli\data $data)
{
$this->console->newDataFromOrigin($data, $this->name);
}
}
namespace cli;
interface console
{
function newDataFromOrigin(data $data, data $data);
}
final class data
{
private
$value
;
function __construct($value)
{
if (! is_string($value) && ! is_number($value))
{
throw new \domainException('Console data should be a string or a number');
}
$this->value = (string) $value;
}
function __toString()
{
return $this->value;
}
}
namespace cli\console;
use
cli
;
class basic implements cli\console
{
function newDataFromOrigin(cli\data $data, cli\data $origin)
{
echo $origin . ': ' . $data . PHP_EOL;
return $this;
}
}
namespace pizzeria;
interface client
{
function pizzaioloIs(pizzaiolo $pizzaiolo);
function tomatoPizzaCanBeMadeByPizzaiolo(pizzaiolo $pizzaiolo);
function creamPizzaCanBeMadeByPizzaiolo(pizzaiolo $pizzaiolo);
function peperoniCanBePutOnPizzaBy(pizzaiolo $pizzaiolo);
function cheeseCanBePutOnPizzaBy(pizzaiolo $pizzaiolo);
function baconCanBePutOnPizzaBy(pizzaiolo $pizzaiolo);
function pizzaCanNotBeMadeByPizzaiolo(pizzaiolo $pizzaiolo);
function pizzaioloHasMadePizza(pizzaiolo $pizzaiolo, pizza $pizza);
}
interface pizzaiolo
{
function aPizzaIsNeededByClient(client $client);
function clientWantTomatoPizza();
function clientWantCreamPizza();
function clientWantPepperoniOnItsPizza();
function clientWantCheeseOnItsPizza();
function clientWantBaconOnItsPizza();
}
interface pizza
{
function pepperoniIsAddedByPizzaiolo(pizzaiolo $pizzaiolo);
function cheeseIsAddedByPizzaiolo(pizzaiolo $pizzaiolo);
function baconIsAddedByPizzaiolo(pizzaiolo $pizzaiolo);
}
namespace pizzeria\pizza;
use
pizzeria
;
abstract class base implements pizzeria\pizza
{
private $size;
function pepperoniIsAddedByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
return $this;
}
function cheeseIsAddedByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
return $this;
}
function baconIsAddedByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
return $this;
}
}
final class tomato extends base
{
}
final class cream extends base
{
}
namespace pizzeria\client;
use
world,
cli,
pizzeria
;
class italian extends world\human implements pizzeria\client
{
function pizzaioloIs(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('I\'m hungry, i want to eat a pizza…'));
$pizzaiolo->aPizzaIsNeededByClient($this);
return $this;
}
function tomatoPizzaCanBeMadeByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('I\'m italian, sure i wan\'t a tomato pizza!'));
$pizzaiolo->clientWantTomatoPizza();
return $this;
}
function creamPizzaCanBeMadeByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('What the fuck is a cream pizza? Sure i will never eat this crap!'));
return $this;
}
function peperoniCanBePutOnPizzaBy(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('I like pepperoni!'));
$pizzaiolo->clientWantPepperoniOnItsPizza();
return $this;
}
function cheeseCanBePutOnPizzaBy(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('Yes, i want lot of cheese on my pizza!'));
$pizzaiolo->clientWantCheeseOnItsPizza();
return $this;
}
function baconCanBePutOnPizzaBy(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('Bacon… why not!'));
$pizzaiolo->clientWantBaconOnItsPizza();
return $this;
}
function pizzaCanNotBeMadeByPizzaiolo(pizzeria\pizzaiolo $pizzaiolo)
{
$this->say(new cli\data('Really? Sigh!'));
return $this;
}
function pizzaioloHasMadePizza(pizzeria\pizzaiolo $pizzaiolo, pizzeria\pizza $pizza)
{
$this->say(new cli\data('Thank you, it looks really delicious!'));
}
}
namespace pizzeria\pizzaiolo;
use
world,
cli,
pizzeria
;
class starred extends world\human implements pizzeria\pizzaiolo
{
private
$client,
$pizza
;
function aPizzaIsNeededByClient(pizzeria\client $client)
{
$this->say(new cli\data('Welcome in my humble pizzeria!'));
$starred = clone $this;
$starred->makePizzaForClient($client);
return $this;
}
function clientWantTomatoPizza()
{
$this->say(new cli\data('Let\'s go for a tomato pizza!'));
$this->pizza = new pizzeria\pizza\tomato;
return $this;
}
function clientWantCreamPizza()
{
$this->say(new cli\data('Let\'s go for a cream pizza, even if i think that pizza should only be tomato based!'));
$this->pizza = new pizzeria\pizza\cream;
return $this;
}
function clientWantPepperoniOnItsPizza()
{
if ($this->pizza)
{
$this->say(new cli\data('So, you like pepperoni? do you know that it was made from cured pork and beef mashed together?'));
$this->pizza->pepperoniIsAddedByPizzaiolo($this);
}
return $this;
}
function clientWantCheeseOnItsPizza()
{
if ($this->pizza)
{
$this->say(new cli\data('I\'m using only parmesan, it\'s better than any other fucking emmenthal!'));
$this->pizza->cheeseIsAddedByPizzaiolo($this);
}
return $this;
}
function clientWantBaconOnItsPizza()
{
if ($this->pizza)
{
$this->say(new cli\data('Do you know that bacon is usually made from side and back cuts of pork?'));
$this->pizza->baconIsAddedByPizzaiolo($this);
}
return $this;
}
private function makePizzaForClient(pizzeria\client $client)
{
$this->client = $client;
$this->say(new cli\data('Ok… so do you want a tomato based pizza?'));
$client->tomatoPizzaCanBeMadeByPizzaiolo($this);
if (! $this->pizza)
{
$this->say(new cli\data('Maybe a cream based pizza?'));
$client->creamPizzaCanBeMadeByPizzaiolo($this);
}
if (! $this->pizza)
{
$this->say(new cli\data('All my apologize, i can not do anything for you'));
$client->pizzaCanNotBeMadeByPizzaiolo($this);
return $this;
}
$this->say(new cli\data('Pepperoni?'));
$client->peperoniCanBePutOnPizzaBy($this);
$this->say(new cli\data('Cheese?'));
$client->cheeseCanBePutOnPizzaBy($this);
$this->say(new cli\data('Bacon?'));
$client->baconCanBePutOnPizzaBy($this);
$this->say(new cli\data('This is your pizza, i\'m pretty sure that it\'s the best pizza i have ever made!'));
$client->pizzaioloHasMadePizza($this, $this->pizza);
return $this;
}
}
namespace pizzeria;
use
cli,
cli\console
;
$console = new console\basic;
(new client\italian(new cli\data('Marcelo'), $console))->pizzaioloIs(new pizzaiolo\starred(new cli\data('Paul Bauchuse'), $console));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment