samizdam/PhamilyFramework

View on GitHub
src/Collection/AbstractPersonaCollection.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Phamily\Framework\Collection;

use Phamily\Framework\Model\PersonaInterface;
use Phamily\Framework\Model\Exception\OutOfBoundsException;

abstract class AbstractPersonaCollection implements PersonaCollectionInterface
{
    protected $persona;

    public function __construct(PersonaInterface $persona)
    {
        $this->persona = $persona;
    }

    abstract protected function validateAddition(PersonaInterface $persona);

    /*
     * PersonaCollectionInterface implemantation
     */
    protected $items = [];

    public function add(PersonaInterface $persona)
    {
        if ($this->validateAddition($persona)) {
            $this->items[] = $persona;
        }
    }

    public function contains(PersonaInterface $persona)
    {
        return in_array($persona, $this->items, true);
    }

    /*
     * SPL Countable implementation
     */
    public function count()
    {
        return count($this->items);
    }

    /*
     * SPL SeekableIterator implementation
     */
    protected $position = 0;

    public function seek($position)
    {
        if ($position >= $this->count()) {
            throw new OutOfBoundsException("Persona has only {$this->count()} spouses");
        }
        $this->position = $position;
    }

    public function current()
    {
        return $this->items[$this->position];
    }

    public function next()
    {
        ++$this->position;
    }

    public function key()
    {
        return $this->position;
    }

    public function valid()
    {
        return $this->position < $this->count();
    }

    public function rewind()
    {
        $this->position = 0;
    }
}