Skip to content

Instantly share code, notes, and snippets.

@mageekguy
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mageekguy/30598b826bdd93b60774 to your computer and use it in GitHub Desktop.
Save mageekguy/30598b826bdd93b60774 to your computer and use it in GitHub Desktop.
East oriented movie lister
<?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