Completed
Push — master ( 4f4b82...1c4c30 )
by Joshua
01:53
created

Memoizes::getMemoized()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 2
eloc 2
nc 2
nop 0
crap 2
1
<?php
2
/**
3
 * This file is part of the Jrumbut.EloquentMemoize
4
 *
5
 * @license http://opensource.org/licenses/MIT MIT
6
 */
7
namespace Jrumbut\EloquentMemoize\Traits;
8
9
use Illuminate\Database\Eloquent\Model;
10
11
trait Memoizes
12
{
13
    /**
14
    * List of attributes to be memoized
15
    *
16
    * @var Array
17
    */
18
    protected static $memoized = [];
19
20
    /**
21
    * Structure where memoized attributes are stored
22
    *
23
    * @var Array
24
    */
25
    protected $memoized_values = [];
26
27
    /**
28
    * Is memoizing enabled?
29
    *
30
    * @var bool
31
    */
32
    protected static $memoizing_enabled = true;
33
34
    /**
35
    * See if attribute has been memoized, and if so return it, else do
36
    * parent procedure for getting attribute
37
    *
38
    * @param string $key
39
    * @return mixed $value
40
    */
41
    public function getAttribute($key)
42
    {
43
        $value = null;
0 ignored issues
show
Unused Code introduced by
$value is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
44
45
        if ($this->shouldBeMemoized($key)) {
46
            if (array_key_exists($key, $this->memoized_values)) {
47
                $value = $this->memoized_values[$key];
48
            } else {
49
                $value = parent::getAttribute($key);
50
                $this->memoizeAttribute($key, $value);
51
            }
52
        } else {
53
            $value = parent::getAttribute($key);
54
        }
55
56
        return $value;
57
    }
58
59
    /**
60
    * Set (and clear memoized value for) a given attribute on the model.
61
    *
62
    * @param string $key
63
    * @param mixed  $value
64
    * @return $this
65
    */
66 7
    public function setAttribute($key, $value)
67
    {
68
        // Remove the old value, no one wants it anymore
69 7
        if (array_key_exists($key, $this->memoized_values)) {
70
            unset($this->memoized_values[$key]);
71
        }
72
73 7
        return parent::setAttribute($key, $value);
74
    }
75
76
    /**
77
     * Memoize attributes
78
     *
79
     * @param string $key
80
     * @param mixed  $value
81
     */
82
    public function memoizeAttribute($key, $value)
83
    {
84
        $this->memoized_values[$key] = $value;
85
    }
86
87
    /**
88
    * Get the memoized attributes for the model.
89
    *
90
    * @return array
91
    */
92 5
    public function getMemoized()
93
    {
94 5
        return static::$memoizing_enabled ? static::$memoized : [];
95
    }
96
97
    /**
98
    * Set the memoized attributes for the model.
99
    *
100
    * @param array $memoized
101
    * @return $this
102
    */
103 4
    public static function setMemoized(array $memoized)
104
    {
105 4
        static::$memoized = $memoized;
106 4
    }
107
108
    /**
109
    * Disable all memoization.
110
    *
111
    * @return void
112
    */
113 2
    public static function disableMemoization()
114
    {
115 2
        static::$memoizing_enabled = false;
116 2
    }
117
118
    /**
119
    * Enable memoization.
120
    *
121
    * @return void
122
    */
123 1
    public static function enableMemoization()
124
    {
125 1
        static::$memoizing_enabled = true;
126 1
    }
127
128
    /**
129
     * Check if attribute should be memoized
130
     *
131
     * @param string $key
132
     * @return bool should_be_memoized
133
     */
134 3
    public function shouldBeMemoized($key)
135
    {
136 3
        $memoized = $this->getMemoized();
137 3
        return (in_array($key, $memoized) || $memoized == ['*'])  && static::$memoizing_enabled;
138
    }
139
}
140