WriteProtectTab::requireReadWrite()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 0
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Copyright (c) 2016-present Ganbaro Digital Ltd
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 *
11
 *   * Redistributions of source code must retain the above copyright
12
 *     notice, this list of conditions and the following disclaimer.
13
 *
14
 *   * Redistributions in binary form must reproduce the above copyright
15
 *     notice, this list of conditions and the following disclaimer in
16
 *     the documentation and/or other materials provided with the
17
 *     distribution.
18
 *
19
 *   * Neither the names of the copyright holders nor the names of his
20
 *     contributors may be used to endorse or promote products derived
21
 *     from this software without specific prior written permission.
22
 *
23
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
 * POSSIBILITY OF SUCH DAMAGE.
35
 *
36
 * @category  Libraries
37
 * @package   MissingBits/Entities
38
 * @author    Stuart Herbert <[email protected]>
39
 * @copyright 2016-present Ganbaro Digital Ltd www.ganbarodigital.com
40
 * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
41
 * @link      http://ganbarodigital.github.io/php-the-missing-bits
42
 */
43
44
namespace GanbaroDigital\MissingBits\Entities;
45
use GanbaroDigital\MissingBits\TypeInspectors\GetPrintableType;
46
47
/**
48
 * very simple implementation of the WriteProtectableEntity interface
49
 */
50
trait WriteProtectTab
51
{
52
    /**
53
     * we start in read-write mode
54
     * @var boolean
55
     */
56
    private $readOnly = false;
57
58
    /**
59
     * by default, the read-only mode can be togged on and off
60
     * @var boolean
61
     */
62
    private $readOnlyForever = false;
63
64
    /**
65
     * can we edit this entity?
66
     *
67
     * @return boolean
68
     *         FALSE if we can edit this entity
69
     *         TRUE otherwise
70
     */
71
    public function isReadOnly()
72
    {
73
        return $this->readOnly;
74
    }
75
76
    /**
77
     * can we edit this entity?
78
     *
79
     * @return boolean
80
     *         TRUE if we can edit this entity
81
     *         FALSE otherwise
82
     */
83
    public function isReadWrite()
84
    {
85
        if ($this->readOnly) {
86
            return false;
87
        }
88
89
        return true;
90
    }
91
92
    /**
93
     * disable editing this entity
94
     *
95
     * you can re-enable editing this entity by calling ::setReadWrite()
96
     *
97
     * @return void
98
     */
99
    public function setReadOnly()
100
    {
101
        $this->readOnly = true;
102
    }
103
104
    /**
105
     * disable editing this entity forever
106
     *
107
     * after calling this method, any attempt to call ::setReadWrite() will
108
     * cause a ReadOnlyForever exception
109
     *
110
     * @return void
111
     */
112
    public function setReadOnlyForever()
113
    {
114
        $this->readOnly = true;
115
        $this->readOnlyForever = true;
116
    }
117
118
    /**
119
     * enable editing this entity
120
     *
121
     * @throws ReadOnlyForeverException
122
     * @return void
123
     */
124
    public function setReadWrite()
125
    {
126
        // make sure our wishes are respected
127
        if ($this->readOnlyForever) {
128
            // if we get here, we are in read-only-forver mode, and
129
            // must not be turned back into a read-write entity
130
            $type = GetPrintableType::of($this);
131
132
            throw new ReadOnlyForeverException("{$type} cannot be made read-write");
133
        }
134
135
        $this->readOnly = false;
136
    }
137
138
    /**
139
     * throw an exception if the object is not in read-write mode
140
     *
141
     * @return void
142
     * @throws ReadOnlyException
143
     */
144
    protected function requireReadWrite()
145
    {
146
        if (!$this->readOnly) {
147
            return;
148
        }
149
150
        // if we get here, we are in read-only mode, and cannot be edited
151
        $type = GetPrintableType::of($this);
152
153
        throw new ReadOnlyException("{$type} is read-only; cannot edit");
154
    }
155
}
156