Passed
Push — master ( 0b4ab1...035e32 )
by Esteban De La Fuente
03:21
created

ServiceAdapter::__toString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Foundation\Adapter;
26
27
use Derafu\Lib\Core\Foundation\Contract\ServiceInterface;
28
29
/**
30
 * Permite proporcionar de manera segura un servicio que no implementa la
31
 * interfaz ServiceInterface.
32
 *
33
 * El adaptador permite usar de manera segura el servicio. Exponiendo solo los
34
 * métodos públicos que la instancia de la clase adaptada tenga. No se permite
35
 * el acceso directo a atributos de la instancia adaptada.
36
 *
37
 * Este adaptador es para usos muy específicos, se desaconseja su uso y en
38
 * general siempre debe construirse un servicio que implemente ServiceInterface
39
 * o extienda de AbstractService utilizando composición.
40
 */
41
42
/**
43
 * Clase que funciona como envoltura de una instancia.
44
 *
45
 * Es un adaptador que permite usar cualquier método público de la instancia
46
 * como un servicio.
47
 */
48
class ServiceAdapter implements ServiceInterface
49
{
50
    /**
51
     * Instancia que se está adaptando a servicio.
52
     *
53
     * @var object
54
     */
55
    private object $adaptee;
56
57
    /**
58
     * Constructor del adaptador.
59
     *
60
     * @param object $adaptee
61
     */
62 2
    public function __construct(object $adaptee)
63
    {
64 2
        $this->adaptee = $adaptee;
65
    }
66
67
    /**
68
     * Método mágico para poder llamar a cualquier método público de la
69
     * instancia de la clase adaptada a través del servicio.
70
     *
71
     * @param string $name
72
     * @param array $arguments
73
     * @return mixed
74
     */
75
    public function __call(string $name, array $arguments): mixed
76
    {
77
        return call_user_func_array([$this->adaptee, $name], $arguments);
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    public function __toString(): string
84
    {
85
        return (string) $this->getId();
86
    }
87
88
    /**
89
     * {@inheritdoc}
90
     */
91 1
    public function getId(): int|string
92
    {
93 1
        if (method_exists($this->adaptee, 'getId')) {
94 1
            return $this->adaptee->getId();
95
        }
96
97
        return get_class($this->adaptee);
98
    }
99
100
    /**
101
     * {@inheritdoc}
102
     */
103
    public function getName(): string
104
    {
105
        if (method_exists($this->adaptee, 'getName')) {
106
            return $this->adaptee->getName();
107
        }
108
109
        return get_class($this->adaptee);
110
    }
111
}
112