Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
19 / 19
SubsetableCollectionTrait
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
8
100.00% covered (success)
100.00%
19 / 19
 getSubset
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
13 / 13
 newInstance
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 fromArray
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
<?php
/**
 * This file is part of the Hephaistos project management API.
 * 
 * As each files provides by the CSCFA, this file is licensed
 * under the MIT license.
 *
 * PHP version 5.6
 *
 * @category Trait
 * @package  Hephaistos
 * @author   matthieu vallance <matthieu.vallance@cscfa.fr>
 * @license  MIT <https://opensource.org/licenses/MIT>
 * @link     http://cscfa.fr
 */
namespace CSDT\CollectionsBundle\TraitCollection;
use CSDT\CollectionsBundle\CollectionInterfaces\ContainerCollectionInterface;
use CSDT\CollectionsBundle\CollectionInterfaces\CollectionInterface;
/**
 * Subsetable collection trait
 *
 * This trait define the logic of a
 * subsetable collection:
 *
 * @category Trait
 * @package  Hephaistos
 * @author   matthieu vallance <matthieu.vallance@cscfa.fr>
 * @license  MIT <https://opensource.org/licenses/MIT>
 * @link     http://cscfa.fr
 */
trait SubsetableCollectionTrait
{
    
    /**
     * Get subset
     * 
     * This method return a new ContainerCollectionInterface
     * containing the value of the given key, parsed
     * as ContainerCollectionInterface.
     * 
     * @param mixed $key The key whence create the subset
     * 
     * @throws \LogicException If the method is called with an instance that
     *                         don't match ContainerCollectionInterface
     * @return ContainerCollectionInterface
     */
    public function getSubset($key)
    {
        $target = $this->newInstance();
        
        if (!($target instanceof ContainerCollectionInterface)) {
            throw new \LogicException(
                "The SubsetableCollectionTrait must be used".
                " into ContainerCollectionInterface childs"
            );
        }
        
        if ($this->has($key)) {
            $source = $this->get($key);
            
            if (is_array($source)) {
                $this->fromArray($source, $target);
            } else if ($source instanceof CollectionInterface) {
                $this->fromArray($source->toArray(), $target);
            }
        }
        
        return $target;
    }
    
    /**
     * New instance
     * 
     * This method is used to create dynamically
     * an instance of ContainerCollectionInterface.
     * 
     * @return                     ContainerCollectionInterface
     * @codingStandardsIgnoreStart
     */
    private function newInstance()
    {
        // @codingStandardsIgnoreEnd
        
        $reflection = new \ReflectionClass($this);
        return $reflection->newInstanceWithoutConstructor();
    }
    
    /**
     * From array
     * 
     * This method hydrate a ContainerCollectionInterface
     * from the values and key contained into an array
     * 
     * @param array                        $source The source array
     * @param ContainerCollectionInterface $target The target collection
     * 
     * @return void
     */
    protected function fromArray(
        array $source,
        ContainerCollectionInterface $target
    ) {
        foreach ($source as $key => $value) {
            $target->set($key, $value);
        }
    }
}