ObjectRenderer   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 8
c 2
b 0
f 0
lcom 1
cbo 4
dl 0
loc 73
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A handles() 0 3 1
A headElements() 0 3 1
A getProperties() 0 13 3
A render() 0 17 2
1
<?php
2
namespace rtens\domin\delivery\web\renderers;
3
4
use rtens\domin\delivery\RendererRegistry;
5
use rtens\domin\delivery\web\Element;
6
use rtens\domin\delivery\web\renderers\link\LinkPrinter;
7
use rtens\domin\delivery\web\WebRenderer;
8
use watoki\reflect\PropertyReader;
9
use watoki\reflect\TypeFactory;
10
11
class ObjectRenderer implements WebRenderer {
12
13
    /** @var RendererRegistry */
14
    private $renderers;
15
16
    /** @var LinkPrinter */
17
    private $links;
18
19
    /** @var TypeFactory */
20
    private $types;
21
22
    public function __construct(RendererRegistry $renderers, TypeFactory $types, LinkPrinter $links) {
23
        $this->renderers = $renderers;
24
        $this->types = $types;
25
        $this->links = $links;
26
    }
27
28
    /**
29
     * @param mixed $value
30
     * @return bool
31
     */
32
    public function handles($value) {
33
        return is_object($value);
34
    }
35
36
    /**
37
     * @param object $value
38
     * @return mixed
39
     */
40
    public function render($value) {
41
        if (method_exists($value, '__toString')) {
42
            return (string)$value;
43
        }
44
45
        return (string)new Element('div', ['class' => 'panel panel-info'], [
46
            new Element('div', ['class' => 'panel-heading clearfix'], [
47
                new Element('h3', ['class' => 'panel-title'], [
48
                    htmlentities((new \ReflectionClass($value))->getShortName()),
49
                    new Element('small', ['class' => 'pull-right'], $this->links->createLinkElements($value))
50
                ])
51
            ]),
52
            new Element('div', ['class' => 'panel-body'], [
53
                (new MapRenderer($this->renderers, $this->links))->renderArray($this->getProperties($value))
54
            ])
55
        ]);
56
    }
57
58
    /**
59
     * @param mixed $value
60
     * @return array|Element[]
61
     */
62
    public function headElements($value) {
63
        return (new MapRenderer($this->renderers, $this->links))->headElements($this->getProperties($value));
64
    }
65
66
    /**
67
     * @param $value
68
     * @return array
69
     */
70
    private function getProperties($value) {
71
        $reader = new PropertyReader($this->types, get_class($value));
72
73
        $map = [];
74
        foreach ($reader->readInterface($value) as $property) {
75
            if (!$property->canGet()) {
76
                continue;
77
            }
78
79
            $map[$property->name()] = $property->get($value);
80
        }
81
        return $map;
82
    }
83
}