Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
33 / 33
AnnotationReader
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
7
100.00% covered (success)
100.00%
33 / 33
 __construct( Reader $reader, LoggerInterface $logger )
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 read($object)
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
20 / 20
 getMethods(ReflectionClass $reflectionClass)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 logReaderResult( ReaderResultInterface $readerResult, $object )
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
9 / 9
<?php
/**
 * @author Krzysztof Gzocha <krzysztof.gzocha@xsolve.pl>
 */
namespace Team3\PayU\PropertyExtractor\Reader;
use Doctrine\Common\Annotations\Reader;
use Psr\Log\LoggerInterface;
use ReflectionClass;
use ReflectionMethod;
use Team3\PayU\Annotation\PayU;
use Team3\PayU\PropertyExtractor\ExtractorException;
class AnnotationReader implements ReaderInterface
{
    const ANNOTATION_CLASS = 'Team3\PayU\Annotation\PayU';
    /**
     * @var Reader
     */
    private $reader;
    /**
     * @var LoggerInterface
     */
    private $logger;
    /**
     * @param Reader          $reader
     * @param LoggerInterface $logger
     */
    public function __construct(
        Reader $reader,
        LoggerInterface $logger
    ) {
        $this->reader = $reader;
        $this->logger = $logger;
    }
    /**
     * @inheritdoc
     */
    public function read($object)
    {
        try {
            $reflectionClass = new ReflectionClass($object);
        } catch (\ReflectionException $exception) {
            throw new ExtractorException(
                $exception->getMessage(),
                $exception->getCode(),
                $exception
            );
        }
        $read = [];
        foreach ($this->getMethods($reflectionClass) as $reflectionMethod) {
            /** @var PayU $methodAnnotation */
            $methodAnnotation = $this
                ->reader
                ->getMethodAnnotation($reflectionMethod, self::ANNOTATION_CLASS);
            if (!is_object($methodAnnotation)) {
                continue;
            }
            $readerResult = new ReaderResult(
                $reflectionMethod->getName(),
                $methodAnnotation->getPropertyName()
            );
            $read[] = $readerResult;
            $this->logReaderResult($readerResult, $object);
        }
        return $read;
    }
    /**
     * @param ReflectionClass $reflectionClass
     *
     * @return ReflectionMethod[]
     */
    private function getMethods(ReflectionClass $reflectionClass)
    {
        return $reflectionClass->getMethods();
    }
    /**
     * @param ReaderResultInterface $readerResult
     * @param object                $object
     */
    private function logReaderResult(
        ReaderResultInterface $readerResult,
        $object
    ) {
        $this
            ->logger
            ->debug(sprintf(
                '%s found result on object %s method %s with property name %s',
                get_class($this),
                get_class($object),
                $readerResult->getMethodName(),
                $readerResult->getPropertyName()
            ));
    }
}