Last active
August 29, 2015 14:20
-
-
Save mageekguy/f96066782bf2d742e75b to your computer and use it in GitHub Desktop.
An east pizza!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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