Completed
Pull Request — master (#65)
by Marko
02:39
created

Mixin::attr()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 14
ccs 7
cts 7
cp 1
rs 9.4285
cc 3
eloc 9
nc 3
nop 1
crap 3
1
<?php
2
/** @formatter:off
3
 * ******************************************************************
4
 * Created by   Marko Kungla on Jun 20, 2016 - 9:12:11 PM
5
 * Contact      [email protected]
6
 * @copyright   2016 Marko Kungla - https://github.com/mkungla
7
 * @license     The MIT License (MIT)
8
 * 
9
 * @category       AframeVR
10
 * @package        aframe-php
11
 * 
12
 * Lang         PHP (php version >= 7)
13
 * Encoding     UTF-8
14
 * File         Mixin.php
15
 * Code format  PSR-2 and 12
16
 * @link        https://github.com/mkungla/aframe-php
17
 * @issues      https://github.com/mkungla/aframe-php/issues
18
 * ********************************************************************
19
 * Contributors:
20
 * @author Marko Kungla <[email protected]>
21
 * ********************************************************************
22
 * Comments:
23
 * @formatter:on */
24
namespace AframeVR\Core\Assets;
25
26
use \AframeVR\Core\Exceptions\BadComponentCallException;
27
use \AframeVR\Interfaces\Core\Assets\MixinInterface;
28
use \AframeVR\Core\Helpers\AssetsAbstract;
29
30
final class Mixin extends AssetsAbstract implements MixinInterface
31
{
32
33
    /**
34
     * DOM tag name of asset item
35
     *
36
     * @var string
37
     */
38
    protected $element_tag = 'a-mixin';
39
    
40
    /**
41
     * Array of mocked components
42
     *
43
     * @var array
44
     */
45
    protected $components = array();
46
47
    /**
48
     * Load component for this entity
49
     *
50
     * @param string $component_name            
51
     * @throws \AframeVR\Core\Exceptions\BadComponentCallException
52
     * @return object|null
53
     */
54 2
    public function attr(string $component_name)
55
    {
56 2
        if (! array_key_exists($component_name, $this->components)) {
57 2
            $component = sprintf('\AframeVR\Core\Components\%s\%sComponent', ucfirst($component_name), 
58
                ucfirst($component_name));
59 2
            if (class_exists($component)) {
60 1
                $this->components[$component_name] = new $component();
61
            } else {
62 1
                throw new BadComponentCallException($component_name);
63
            }
64
        }
65
        
66 1
        return $this->components[$component_name] ?? null;
67
    }
68
    
69
    /**
70
     * Handle entity components
71
     *
72
     * Since we might need to customize these to have
73
     * custom components loaded as $this->methosd aswell therefore
74
     * we have these placeholder magic methods here
75
     *
76
     * @param string $component_name            
77
     * @param array $args            
78
     */
79 1
    public function __call(string $component_name, array $args)
80
    {
81 1
        return $this->attr($component_name);
82
    }
83
    
84
    /**
85
     * material.color
86
     *
87
     * @param string $color
88
     * @return Mixin
89
     */
90 1
    public function color(string $color = 'gray')
91
    {
92 1
        $this->attr('Material')
93 1
        ->shader()
94 1
        ->color($color);
95 1
        return $this;
96
    }
97
    
98
    /**
99
     * material.metalness
100
     *
101
     * @param int|float $metalness
102
     * @return Mixin
103
     */
104 1
    public function metalness(float $metalness = 0)
105
    {
106 1
        $this->attr('Material')
107 1
        ->shader()
108 1
        ->metalness($metalness);
109 1
        return $this;
110
    }
111
    
112
    /**
113
     * material.roughness
114
     *
115
     * @param float $roughness
116
     * @return Mixin
117
     */
118 1
    public function roughness(float $roughness = 0.5)
119
    {
120 1
        $this->attr('Material')
121 1
        ->shader()
122 1
        ->roughness($roughness);
123 1
        return $this;
124
    }
125
    
126
    /**
127
     * material.src
128
     *
129
     * @param null|string $src
130
     * @return Mixin
131
     */
132 1
    public function src(string $src = null)
133
    {
134 1
        $this->attr('Material')
135 1
        ->shader()
136 1
        ->src($src);
137 1
        return $this;
138
    }
139
    
140
    /**
141
     * material.shader
142
     *
143
     * @param string $shader
144
     * @return Mixin
145
     */
146 1
    public function shader($shader = 'standard')
147
    {
148 1
        $this->attr('Material')->shader($shader);
149 1
        return $this;
150
    }
151
    
152
    /**
153
     * material.opacity
154
     *
155
     * @param float $opacity
156
     * @return Mixin
157
     */
158 1
    public function opacity(float $opacity = 1.0)
159
    {
160 1
        $this->attr('Material')->opacity($opacity);
161 1
        return $this;
162
    }
163
    
164
    /**
165
     * material.transparent
166
     *
167
     * @param bool $transparent
168
     * @return Mixin
169
     */
170 1
    public function transparent(bool $transparent = false)
171
    {
172 1
        $this->attr('Material')->transparent($transparent);
173 1
        return $this;
174
    }
175
}
176