Last active
August 29, 2015 14:18
-
-
Save mageekguy/30598b826bdd93b60774 to your computer and use it in GitHub Desktop.
East oriented movie lister
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 east\movie\library\finder; | |
use | |
east, | |
east\movie, | |
east\movie\library | |
; | |
interface selector | |
{ | |
function movieLibraryIs(movie\library $library); | |
function movieDirectorShouldBe(movie\director $director); | |
function movieTitleShouldBe(movie\title $title); | |
function movieIs(movie $movie); | |
function movieDirectorIs(movie\director $director); | |
function movieTitleIs(movie\title $title); | |
} | |
namespace east\movie\library\finder\selector; | |
use | |
east, | |
east\movie, | |
east\movie\library, | |
east\movie\library\finder | |
; | |
class directorAndTitle implements finder\selector | |
{ | |
private | |
$library, | |
$directorCriteria, | |
$movieDirector, | |
$titleCriteria, | |
$movieTitle | |
; | |
function __construct() | |
{ | |
$this->library = new library\void; | |
} | |
function movieLibraryIs(library $library) | |
{ | |
$selector = clone $this; | |
$selector->library = $library; | |
return $selector; | |
} | |
function movieDirectorShouldBe(movie\director $director) | |
{ | |
$selector = clone $this; | |
$selector->directorCriteria = $director; | |
return $selector; | |
} | |
function movieTitleShouldBe(movie\title $title) | |
{ | |
$selector->titleCriteria = $title; | |
return $selector; | |
} | |
function movieIs(movie $movie) | |
{ | |
$selector = clone $this; | |
$selector->movieDirector = null; | |
$selector->movieTitle = null; | |
$movie->selectorIs($selector); | |
switch (true) | |
{ | |
case $selector->directorCriteria && $selector->titleCriteria && $selector->movieDirector == $selector->directorCriteria && $selector->movieTitle == $selector->titleCriteria: | |
case $selector->directorCriteria && ! $selector->titleCriteria && $selector->movieDirector == $selector->directorCriteria: | |
case $selector->titleCriteria && ! $selector->directorCriteria && $selector->movieTitle == $selector->titleCriteria: | |
$this->library->newMovie($movie); | |
} | |
return $this; | |
} | |
function movieDirectorIs(movie\director $director) | |
{ | |
$this->movieDirector = $director; | |
return $this; | |
} | |
function movieTitleIs(movie\title $title) | |
{ | |
$this->movieTitle = $title; | |
return $this; | |
} | |
} | |
namespace east\movie\library; | |
use | |
east\movie | |
; | |
interface finder | |
{ | |
function movieDirectorShouldBe(movie\director $director); | |
function movieTitleShouldBe(movie\title $title); | |
function movieIs(movie $movie); | |
function movieLibraryIs(movie\library $library); | |
function movieListerIs(movie\lister $lister); | |
} | |
namespace east\movie\library\finder; | |
use | |
east\movie, | |
east\movie\library | |
; | |
class generic implements library\finder | |
{ | |
private | |
$selector, | |
$library | |
; | |
function __construct(finder\selector $selector = null) | |
{ | |
$this->selector = $selector ?: new library\finder\selector\directorAndTitle; | |
} | |
function movieDirectorShouldBe(movie\director $director) | |
{ | |
$finder = clone $this; | |
$finder->selector = $this->selector->movieDirectorShouldBe($director); | |
return $finder; | |
} | |
function movieTitleShouldBe(movie\title $title) | |
{ | |
$finder = clone $this; | |
$finder->selector = $this->selector->movieTitleShouldBe($title); | |
return $finder; | |
} | |
function movieIs(movie $movie) | |
{ | |
$this->selector->movieIs($movie); | |
return $this; | |
} | |
function movieLibraryIs(movie\library $library) | |
{ | |
$finder = clone $this; | |
$finder->library = new movie\library\void; | |
$finder->selector = $this->selector->movieLibraryIs($finder->library); | |
$library->finderIs($finder); | |
return $finder; | |
} | |
function movieListerIs(movie\lister $lister) | |
{ | |
$lister->movieProviderIs($this->library); | |
return $this; | |
} | |
} | |
namespace east\movie\lister; | |
use | |
east\movie | |
; | |
class cli implements movie\lister | |
{ | |
function newMovie() | |
{ | |
echo '-------------------------' . PHP_EOL; | |
return $this; | |
} | |
function noMoreDataAboutMovie() | |
{ | |
return $this; | |
} | |
function movieDirectorIs(movie\director $director) | |
{ | |
echo 'Director: ' . $director . PHP_EOL; | |
return $this; | |
} | |
function movieTitleIs(movie\title $title) | |
{ | |
echo 'Title: ' . $title . PHP_EOL; | |
return $this; | |
} | |
function movieProviderIs(movie\provider $movieProvider) | |
{ | |
$movieProvider->movieListerIs($this); | |
return $this; | |
} | |
} | |
namespace east; | |
use | |
east\movie | |
; | |
interface movie extends movie\provider | |
{ | |
function selectorIs(movie\library\finder\selector $selector); | |
} | |
namespace east\movie; | |
use | |
east, | |
east\movie | |
; | |
interface provider | |
{ | |
function movieListerIs(lister $lister); | |
} | |
interface library extends provider | |
{ | |
function newMovie(east\movie $movie); | |
function finderIs(library\finder $finder); | |
} | |
interface lister | |
{ | |
function newMovie(); | |
function noMoreDataAboutMovie(); | |
function movieDirectorIs(movie\director $director); | |
function movieTitleIs(movie\title $title); | |
function movieProviderIs(movie\provider $provider); | |
} | |
final class director | |
{ | |
private | |
$value | |
; | |
function __construct($value) | |
{ | |
if (! is_string($value)) | |
{ | |
throw new \domainException('Movie Director should be a string'); | |
} | |
$this->value = $value; | |
} | |
function __toString() | |
{ | |
return $this->value; | |
} | |
} | |
final class title | |
{ | |
private | |
$value | |
; | |
function __construct($value) | |
{ | |
if (! is_string($value)) | |
{ | |
throw new \domainException('Movie title should be a string'); | |
} | |
$this->value = $value; | |
} | |
function __toString() | |
{ | |
return $this->value; | |
} | |
} | |
final class blockbuster implements east\movie | |
{ | |
private | |
$director, | |
$title | |
; | |
function __construct(movie\director $director, movie\title $title) | |
{ | |
$this->director = $director; | |
$this->title = $title; | |
} | |
function selectorIs(movie\library\finder\selector $selector) | |
{ | |
$selector | |
->movieDirectorIs($this->director) | |
->movieTitleIs($this->title) | |
; | |
return $this; | |
} | |
function movieListerIs(movie\lister $lister) | |
{ | |
$lister | |
->newMovie() | |
->movieTitleIs($this->title) | |
->movieDirectorIs($this->director) | |
->noMoreDataAboutMovie() | |
; | |
return $this; | |
} | |
} | |
namespace east\movie\library; | |
use | |
east, | |
east\movie, | |
east\movie\library | |
; | |
class void implements movie\library | |
{ | |
private | |
$movies | |
; | |
function __construct() | |
{ | |
$this->movies = []; | |
} | |
function newMovie(movie $movie) | |
{ | |
$this->movies[] = $movie; | |
return $this; | |
} | |
function finderIs(library\finder $finder) | |
{ | |
foreach ($this->movies as $movie) | |
{ | |
$finder->movieIs($movie); | |
} | |
return $this; | |
} | |
function movieListerIs(movie\lister $lister) | |
{ | |
foreach ($this->movies as $movie) | |
{ | |
$lister->movieProviderIs($movie); | |
} | |
return $this; | |
} | |
} | |
namespace east; | |
use | |
east\movie | |
; | |
(new movie\library\finder\generic) | |
->movieDirectorShouldBe(new movie\Director('Ridley Scott')) | |
->movieLibraryIs((new movie\library\void) | |
->newMovie(new movie\blockbuster(new movie\director('Ridley Scott'), new movie\title('Alien'))) | |
->newMovie(new movie\blockbuster(new movie\director('Christopher Nolan'), new movie\title('Interstellar'))) | |
->newMovie(new movie\blockbuster(new movie\director('Ridley Scott'), new movie\title('Gladiator'))) | |
) | |
->movieListerIs(new movie\lister\cli) | |
; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment