Completed
Push — master ( c50757...259285 )
by Nikolas
04:41 queued 14s
created

ObjectRenderer::render()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 22
rs 8.9197
cc 4
eloc 13
nc 4
nop 1
1
<?php
2
namespace rtens\domin\delivery\cli\renderers;
3
4
use rtens\domin\delivery\Renderer;
5
use rtens\domin\delivery\RendererRegistry;
6
use watoki\reflect\PropertyReader;
7
use watoki\reflect\TypeFactory;
8
9
class ObjectRenderer implements Renderer {
10
11
    /** @var RendererRegistry */
12
    private $renderers;
13
14
    /** @var TypeFactory */
15
    private $types;
16
17
    public function __construct(RendererRegistry $renderers, TypeFactory $types) {
18
        $this->renderers = $renderers;
19
        $this->types = $types;
20
    }
21
22
    /**
23
     * @param mixed $value
24
     * @return bool
25
     */
26
    public function handles($value) {
27
        return is_object($value);
28
    }
29
30
    /**
31
     * @param mixed $value
32
     * @return mixed
33
     */
34
    public function render($value) {
35
        if (method_exists($value, '__toString')) {
36
            return (string)$value;
37
        }
38
39
        $output = [
40
            '### ' . (new \ReflectionClass($value))->getShortName() . ' ###',
41
        ];
42
43
        $reader = new PropertyReader($this->types, $value);
44
        foreach ($reader->readInterface($value) as $property) {
45
            if (!$property->canGet()) {
46
                continue;
47
            }
48
            $propertyValue = $property->get($value);
49
            $rendered = $this->renderers->getRenderer($propertyValue)->render($propertyValue);
50
51
            $output[] = ucfirst($property->name()) . ': ' . rtrim(str_replace(PHP_EOL, PHP_EOL . '    ', $rendered));
52
        }
53
54
        return implode(PHP_EOL, $output) . PHP_EOL;
55
    }
56
}