yrizos/stockpile

View on GitHub
src/Pool.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Stockpile;

use \Psr\Cache\CacheItemInterface as PsrCacheInterface;

class Pool implements PoolInterface
{

    /**
     * @var DriverInterface
     */
    private $driver;

    private $defered = [];

    public function __construct(DriverInterface $driver = null)
    {
        if (is_null($driver)) $driver = Driver::factory('memory');

        $this->setDriver($driver);
    }

    final public function setDriver(DriverInterface $driver)
    {
        $this->driver = $driver;

        return $this;
    }

    final public function getDriver()
    {
        return $this->driver;
    }

    public function getItem($key)
    {
        $value = null;
        $hit   = false;

        if ($this->getDriver()->exists($key)) {
            $value = $this->getDriver()->get($key);
            if ($value) $hit = true;
        }

        return new CacheItem($key, $value, null, $hit);
    }

    public function getItems(array $keys = array())
    {
        $items = [];

        foreach ($keys as $key) $items[$key] = $this->getItem($key);

        return $items;
    }

    public function clear()
    {
        return $this->getDriver()->clear();
    }

    public function deleteItems(array $keys)
    {
        foreach ($keys as $key) $this->getDriver()->delete($key);

        return $this;
    }

    public function save(PsrCacheInterface $item)
    {
        $this->getDriver()->set($item->getKey(), $item->get(), $item->getExpiration());

        return $this;
    }

    public function saveDeferred(PsrCacheInterface $item)
    {
        $this->defered[$item->getKey()] = $item;

        return $this;
    }

    public function commit()
    {
        foreach ($this->defered as $key => $item) {
            $this->save($item);

            unset($this->defered[$key]);
        }

        return empty($this->defered);
    }

    public static function factory($driver, array $options = [])
    {
        if (!($driver instanceof DriverInterface)) $driver = Driver::factory($driver, $options);

        return new Pool($driver);
    }

    public function __destruct()
    {
        $this->commit();
    }
}