Completed
Pull Request — master (#19)
by James
04:03
created
src/Utility/Str.php 2 patches
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -11,39 +11,39 @@
 block discarded – undo
11 11
  * @subpackage Utility
12 12
  */
13 13
 class Str {
14
-	/**
15
-	 * Determine if a given string starts with a given substring.
16
-	 *
17
-	 * @param  string       $haystack
18
-	 * @param  string|array $needles
19
-	 *
20
-	 * @return bool
21
-	 */
22
-	public static function starts_with( $haystack, $needles ) {
23
-		foreach ( (array) $needles as $needle ) {
24
-			if ( '' !== $needle && 0 === strpos( $haystack, $needle ) ) {
25
-				return true;
26
-			}
27
-		}
14
+    /**
15
+     * Determine if a given string starts with a given substring.
16
+     *
17
+     * @param  string       $haystack
18
+     * @param  string|array $needles
19
+     *
20
+     * @return bool
21
+     */
22
+    public static function starts_with( $haystack, $needles ) {
23
+        foreach ( (array) $needles as $needle ) {
24
+            if ( '' !== $needle && 0 === strpos( $haystack, $needle ) ) {
25
+                return true;
26
+            }
27
+        }
28 28
 
29
-		return false;
30
-	}
29
+        return false;
30
+    }
31 31
 
32
-	/**
33
-	 * Determine if a given string ends with a given substring.
34
-	 *
35
-	 * @param  string       $haystack
36
-	 * @param  string|array $needles
37
-	 *
38
-	 * @return bool
39
-	 */
40
-	public static function ends_with( $haystack, $needles ) {
41
-		foreach ( (array) $needles as $needle ) {
42
-			if ( substr( $haystack, - strlen( $needle ) ) === (string) $needle ) {
43
-				return true;
44
-			}
45
-		}
32
+    /**
33
+     * Determine if a given string ends with a given substring.
34
+     *
35
+     * @param  string       $haystack
36
+     * @param  string|array $needles
37
+     *
38
+     * @return bool
39
+     */
40
+    public static function ends_with( $haystack, $needles ) {
41
+        foreach ( (array) $needles as $needle ) {
42
+            if ( substr( $haystack, - strlen( $needle ) ) === (string) $needle ) {
43
+                return true;
44
+            }
45
+        }
46 46
 
47
-		return false;
48
-	}
47
+        return false;
48
+    }
49 49
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -19,9 +19,9 @@  discard block
 block discarded – undo
19 19
 	 *
20 20
 	 * @return bool
21 21
 	 */
22
-	public static function starts_with( $haystack, $needles ) {
23
-		foreach ( (array) $needles as $needle ) {
24
-			if ( '' !== $needle && 0 === strpos( $haystack, $needle ) ) {
22
+	public static function starts_with($haystack, $needles) {
23
+		foreach ((array) $needles as $needle) {
24
+			if ('' !== $needle && 0 === strpos($haystack, $needle)) {
25 25
 				return true;
26 26
 			}
27 27
 		}
@@ -37,9 +37,9 @@  discard block
 block discarded – undo
37 37
 	 *
38 38
 	 * @return bool
39 39
 	 */
40
-	public static function ends_with( $haystack, $needles ) {
41
-		foreach ( (array) $needles as $needle ) {
42
-			if ( substr( $haystack, - strlen( $needle ) ) === (string) $needle ) {
40
+	public static function ends_with($haystack, $needles) {
41
+		foreach ((array) $needles as $needle) {
42
+			if (substr($haystack, - strlen($needle)) === (string) $needle) {
43 43
 				return true;
44 44
 			}
45 45
 		}
Please login to merge, or discard this patch.
src/Contract/Core/I18n.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -2,10 +2,10 @@
 block discarded – undo
2 2
 namespace Intraxia\Jaxion\Contract\Core;
3 3
 
4 4
 interface I18n {
5
-	/**
6
-	 * Loads the plugin's textdomain.
7
-	 *
8
-	 * @return void
9
-	 */
10
-	public function load_plugin_textdomain();
5
+    /**
6
+     * Loads the plugin's textdomain.
7
+     *
8
+     * @return void
9
+     */
10
+    public function load_plugin_textdomain();
11 11
 }
Please login to merge, or discard this patch.
src/Core/I18n.php 2 patches
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -11,53 +11,53 @@
 block discarded – undo
11 11
  * @subpackage Core
12 12
  */
13 13
 class I18n implements I18nContract, HasActions {
14
-	/**
15
-	 * Plugin basename
16
-	 *
17
-	 * @var string
18
-	 */
19
-	private $basename;
14
+    /**
15
+     * Plugin basename
16
+     *
17
+     * @var string
18
+     */
19
+    private $basename;
20 20
 
21
-	/**
22
-	 * Plugin path.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	private $path;
21
+    /**
22
+     * Plugin path.
23
+     *
24
+     * @var string
25
+     */
26
+    private $path;
27 27
 
28
-	/**
29
-	 * I18n constructor.
30
-	 *
31
-	 * @param string $basename Plugin basename.
32
-	 * @param string $path     Plugin path.
33
-	 */
34
-	public function __construct( $basename, $path ) {
35
-		$this->basename = $basename;
36
-		$this->path = $path;
37
-	}
28
+    /**
29
+     * I18n constructor.
30
+     *
31
+     * @param string $basename Plugin basename.
32
+     * @param string $path     Plugin path.
33
+     */
34
+    public function __construct( $basename, $path ) {
35
+        $this->basename = $basename;
36
+        $this->path = $path;
37
+    }
38 38
 
39
-	/**
40
-	 * {@inheritdoc}
41
-	 */
42
-	public function load_plugin_textdomain() {
43
-		load_plugin_textdomain(
44
-			$this->basename,
45
-			false,
46
-			basename( $this->path ) . '/languages/'
47
-		);
48
-	}
39
+    /**
40
+     * {@inheritdoc}
41
+     */
42
+    public function load_plugin_textdomain() {
43
+        load_plugin_textdomain(
44
+            $this->basename,
45
+            false,
46
+            basename( $this->path ) . '/languages/'
47
+        );
48
+    }
49 49
 
50
-	/**
51
-	 * {@inheritDoc}
52
-	 *
53
-	 * @return array
54
-	 */
55
-	public function action_hooks() {
56
-		return array(
57
-			array(
58
-				'hook'   => 'init',
59
-				'method' => 'load_plugin_textdomain',
60
-			),
61
-		);
62
-	}
50
+    /**
51
+     * {@inheritDoc}
52
+     *
53
+     * @return array
54
+     */
55
+    public function action_hooks() {
56
+        return array(
57
+            array(
58
+                'hook'   => 'init',
59
+                'method' => 'load_plugin_textdomain',
60
+            ),
61
+        );
62
+    }
63 63
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
 	 * @param string $basename Plugin basename.
32 32
 	 * @param string $path     Plugin path.
33 33
 	 */
34
-	public function __construct( $basename, $path ) {
34
+	public function __construct($basename, $path) {
35 35
 		$this->basename = $basename;
36 36
 		$this->path = $path;
37 37
 	}
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 		load_plugin_textdomain(
44 44
 			$this->basename,
45 45
 			false,
46
-			basename( $this->path ) . '/languages/'
46
+			basename($this->path).'/languages/'
47 47
 		);
48 48
 	}
49 49
 
Please login to merge, or discard this patch.
src/Contract/Assets/Register.php 2 patches
Indentation   +48 added lines, -48 removed lines patch added patch discarded remove patch
@@ -4,52 +4,52 @@
 block discarded – undo
4 4
 use Intraxia\Jaxion\Contract\Core\HasActions;
5 5
 
6 6
 interface Register extends HasActions {
7
-	/**
8
-	 * Enable debug mode for the enqueued assets.
9
-	 *
10
-	 * Debug mode will enqueue unminified versions of the registered assets.
11
-	 * Primarily, this is intended to be used along with WordPress's `SCRIPT_DEBUG`
12
-	 * constant, which enables unminified core assets to be enqueued.
13
-	 *
14
-	 * @param bool $debug
15
-	 */
16
-	public function set_debug( $debug );
17
-
18
-	/**
19
-	 * Provides a method to register new scripts outside of the constructor.
20
-	 *
21
-	 * @param array $script
22
-	 */
23
-	public function register_script( $script );
24
-
25
-	/**
26
-	 * Provides a method to register new styles outside of the constructor.
27
-	 *
28
-	 * @param array $style
29
-	 */
30
-	public function register_style( $style );
31
-
32
-	/**
33
-	 * Enqueues the web & shared scripts on the Register.
34
-	 */
35
-	public function enqueue_web_scripts();
36
-
37
-	/**
38
-	 * Enqueues the web & shared styles on the Register.
39
-	 */
40
-	public function enqueue_web_styles();
41
-
42
-	/**
43
-	 * Enqueues the admin & shared scripts on the Register.
44
-	 *
45
-	 * @param string $hook Passes a string representing the current page.
46
-	 */
47
-	public function enqueue_admin_scripts( $hook );
48
-
49
-	/**
50
-	 * Enqueues the admin & shared styles on the Register.
51
-	 *
52
-	 * @param string $hook Passes a string representing the current page.
53
-	 */
54
-	public function enqueue_admin_styles( $hook );
7
+    /**
8
+     * Enable debug mode for the enqueued assets.
9
+     *
10
+     * Debug mode will enqueue unminified versions of the registered assets.
11
+     * Primarily, this is intended to be used along with WordPress's `SCRIPT_DEBUG`
12
+     * constant, which enables unminified core assets to be enqueued.
13
+     *
14
+     * @param bool $debug
15
+     */
16
+    public function set_debug( $debug );
17
+
18
+    /**
19
+     * Provides a method to register new scripts outside of the constructor.
20
+     *
21
+     * @param array $script
22
+     */
23
+    public function register_script( $script );
24
+
25
+    /**
26
+     * Provides a method to register new styles outside of the constructor.
27
+     *
28
+     * @param array $style
29
+     */
30
+    public function register_style( $style );
31
+
32
+    /**
33
+     * Enqueues the web & shared scripts on the Register.
34
+     */
35
+    public function enqueue_web_scripts();
36
+
37
+    /**
38
+     * Enqueues the web & shared styles on the Register.
39
+     */
40
+    public function enqueue_web_styles();
41
+
42
+    /**
43
+     * Enqueues the admin & shared scripts on the Register.
44
+     *
45
+     * @param string $hook Passes a string representing the current page.
46
+     */
47
+    public function enqueue_admin_scripts( $hook );
48
+
49
+    /**
50
+     * Enqueues the admin & shared styles on the Register.
51
+     *
52
+     * @param string $hook Passes a string representing the current page.
53
+     */
54
+    public function enqueue_admin_styles( $hook );
55 55
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -13,21 +13,21 @@  discard block
 block discarded – undo
13 13
 	 *
14 14
 	 * @param bool $debug
15 15
 	 */
16
-	public function set_debug( $debug );
16
+	public function set_debug($debug);
17 17
 
18 18
 	/**
19 19
 	 * Provides a method to register new scripts outside of the constructor.
20 20
 	 *
21 21
 	 * @param array $script
22 22
 	 */
23
-	public function register_script( $script );
23
+	public function register_script($script);
24 24
 
25 25
 	/**
26 26
 	 * Provides a method to register new styles outside of the constructor.
27 27
 	 *
28 28
 	 * @param array $style
29 29
 	 */
30
-	public function register_style( $style );
30
+	public function register_style($style);
31 31
 
32 32
 	/**
33 33
 	 * Enqueues the web & shared scripts on the Register.
@@ -44,12 +44,12 @@  discard block
 block discarded – undo
44 44
 	 *
45 45
 	 * @param string $hook Passes a string representing the current page.
46 46
 	 */
47
-	public function enqueue_admin_scripts( $hook );
47
+	public function enqueue_admin_scripts($hook);
48 48
 
49 49
 	/**
50 50
 	 * Enqueues the admin & shared styles on the Register.
51 51
 	 *
52 52
 	 * @param string $hook Passes a string representing the current page.
53 53
 	 */
54
-	public function enqueue_admin_styles( $hook );
54
+	public function enqueue_admin_styles($hook);
55 55
 }
Please login to merge, or discard this patch.
src/Contract/Axolotl/Collection.php 2 patches
Indentation   +314 added lines, -314 removed lines patch added patch discarded remove patch
@@ -9,318 +9,318 @@
 block discarded – undo
9 9
 
10 10
 interface Collection extends Iterator, Countable, Serializes {
11 11
 
12
-	/**
13
-	 * Returns the type of the collection.
14
-	 *
15
-	 * @return string
16
-	 */
17
-	public function get_type();
18
-
19
-	/**
20
-	 * Returns a collection with $element added.
21
-	 *
22
-	 * @param  mixed $element
23
-	 * @return Collection
24
-	 * @throws InvalidArgumentException
25
-	 */
26
-	public function add( $element );
27
-
28
-	/**
29
-	 * Removes every element from the collection.
30
-	 *
31
-	 * @return Collection
32
-	 */
33
-	public function clear();
34
-
35
-	/**
36
-	 * Returns true if the collection contains any elements that satisfy
37
-	 * $condition, returns false if it contains none.
38
-	 *
39
-	 * @param callable $condition
40
-	 * @return bool
41
-	 */
42
-	public function contains( $condition );
43
-
44
-	/**
45
-	 * Returns the first element in the collection that satisfies
46
-	 * $condition, returns false if no such element exists.
47
-	 *
48
-	 * @param callable $condition
49
-	 * @return mixed
50
-	 */
51
-	public function find( $condition );
52
-
53
-	/**
54
-	 * Returns the index of the first element in the collection that satisfies
55
-	 * $condition, returns -1 if no such element exists.
56
-	 *
57
-	 * @param callable $condition
58
-	 * @return int
59
-	 */
60
-	public function find_index( $condition );
61
-
62
-	/**
63
-	 * Returns the element in the collection at $index.
64
-	 *
65
-	 * @param  int $index Index to get element from.
66
-	 * @return mixed
67
-	 * @throws OutOfRangeException
68
-	 */
69
-	public function at( $index );
70
-
71
-	/**
72
-	 * Returns true if $index is within the collection's range and returns false
73
-	 * if it is not.
74
-	 *
75
-	 * @param  int $index Index to check for existence.
76
-	 * @return bool
77
-	 * @throws InvalidArgumentException
78
-	 */
79
-	public function index_exists( $index );
80
-
81
-	/**
82
-	 * Returns the number of elements in the collection.
83
-	 *
84
-	 * @return int
85
-	 */
86
-	public function count();
87
-
88
-	/**
89
-	 * Returns a collection that only contains the elements which satisfy
90
-	 * $condition.
91
-	 *
92
-	 * @param callable $condition
93
-	 * @return Collection
94
-	 */
95
-	public function filter( $condition );
96
-
97
-	/**
98
-	 * Returns the last element in the collection that satisfies $condition,
99
-	 * returns false if no such element exists.
100
-	 *
101
-	 * @param callable $condition
102
-	 * @return mixed
103
-	 */
104
-	public function find_last( $condition );
105
-
106
-	/**
107
-	 * Returns the index of the last element in the collection that satisfies
108
-	 * $condition, returns -1 if no such element exists.
109
-	 *
110
-	 * @param callable $condition
111
-	 * @return int
112
-	 */
113
-	public function find_last_index( $condition );
114
-
115
-	/**
116
-	 * Returns a collection that contains the subset of elements ranging from the
117
-	 * index $start to $end.
118
-	 *
119
-	 * @param  int $start Begining index to slice from.
120
-	 * @param  int $end   End index to slice to.
121
-	 * @return Collection
122
-	 * @throws InvalidArgumentException
123
-	 */
124
-	public function slice( $start, $end );
125
-
126
-	/**
127
-	 * Inserts $element at $index.
128
-	 *
129
-	 * @param int   $index     Index to start at.
130
-	 * @param mixed $element Element to insert.
131
-	 * @return Collection
132
-	 * @throws InvalidArgumentException
133
-	 * @throws OutOfRangeException
134
-	 */
135
-	public function insert( $index, $element );
136
-
137
-	/**
138
-	 * Inserts the range $elements at $index.
139
-	 *
140
-	 * @param int   $index
141
-	 * @param array $elements
142
-	 * @return Collection
143
-	 * @throws OutOfRangeException
144
-	 */
145
-	public function insert_range( $index, array $elements );
146
-
147
-	/**
148
-	 * Removes all of the elements that satisfy $condition.
149
-	 *
150
-	 * @param  callable $condition
151
-	 * @return Collection
152
-	 */
153
-	public function reject( $condition );
154
-
155
-	/**
156
-	 * Removes the element at $index.
157
-	 *
158
-	 * @param  int $index Index to remove.
159
-	 * @return Collection
160
-	 * @throws OutOfRangeException
161
-	 */
162
-	public function remove_at( $index );
163
-
164
-	/**
165
-	 * Reverses the order of the elements in the collection.
166
-	 *
167
-	 * @return Collection
168
-	 */
169
-	public function reverse();
170
-
171
-	/**
172
-	 * Sorts the elements in the collection using the user supplied comparison
173
-	 * function $callback.
174
-	 *
175
-	 * @param callable $callback
176
-	 * @return Collection
177
-	 */
178
-	public function sort( $callback );
179
-
180
-	/**
181
-	 * Returns an array containing the elements in the collection.
182
-	 *
183
-	 * @return array
184
-	 */
185
-	public function to_array();
186
-
187
-	/**
188
-	 * Iteratively reduces the collection to a single value using the callback
189
-	 * function $callable.
190
-	 *
191
-	 * @param callable $callable
192
-	 * @param null     $initial
193
-	 * @return mixed
194
-	 */
195
-	public function reduce( $callable, $initial = null );
196
-
197
-	/**
198
-	 * Returns true if every element in the collection satisfies $condition,
199
-	 * returns false if not.
200
-	 *
201
-	 * @param callable $condition
202
-	 * @return bool
203
-	 */
204
-	public function every( $condition );
205
-
206
-	/**
207
-	 * Removes all of the elements in the collection starting at index $num.
208
-	 *
209
-	 * @param  int $num Number of elements to drop.
210
-	 * @return Collection
211
-	 * @throws InvalidArgumentException
212
-	 */
213
-	public function drop( $num );
214
-
215
-	/**
216
-	 * Removes all of the elements in the collectioin between index 0 and $num.
217
-	 *
218
-	 * @param int $num Number of elements to drop.
219
-	 * @return Collection
220
-	 * @throws InvalidArgumentException
221
-	 */
222
-	public function drop_right( $num );
223
-
224
-	/**
225
-	 * Iteratively drops elements in the collection that satisfy $condition until
226
-	 * an element is encountered that does not satisfy $condition.
227
-	 *
228
-	 * @param callable $condition
229
-	 * @return Collection
230
-	 */
231
-	public function drop_while( $condition );
232
-
233
-	/**
234
-	 * Removes the first element in the collection.
235
-	 *
236
-	 * @return Collection
237
-	 * @throws InvalidArgumentException
238
-	 */
239
-	public function tail();
240
-
241
-	/**
242
-	 * Removes all of the elements in the collection starting at index $num.
243
-	 *
244
-	 * @param  int $num Number of elements to take.
245
-	 * @return Collection
246
-	 * @throws InvalidArgumentException
247
-	 */
248
-	public function take( $num );
249
-
250
-	/**
251
-	 * Removes all of the elements in the collection before index $num.
252
-	 *
253
-	 * @param int $num Number of elements to take.
254
-	 * @return Collection
255
-	 * @throws InvalidArgumentException
256
-	 */
257
-	public function take_right( $num );
258
-
259
-	/**
260
-	 * Iterates through the collection until an element is encountered that does
261
-	 * not satisfy $condition, then drops all of the elements starting at that
262
-	 * index.
263
-	 *
264
-	 * @param callable $condition
265
-	 * @return Collection
266
-	 */
267
-	public function take_while( $condition );
268
-
269
-	/**
270
-	 * Applies the callback function $callable to each element in the collection.
271
-	 *
272
-	 * @param callable $callable
273
-	 */
274
-	public function each( $callable );
275
-
276
-	/**
277
-	 * Returns a new instance of the collection with the callback function
278
-	 * $callable applied to each element.
279
-	 *
280
-	 * @param callable $callable
281
-	 * @return Collection
282
-	 */
283
-	public function map( $callable );
284
-
285
-	/**
286
-	 * Iteratively reduces the collection to a single value using the callback
287
-	 * function $callable starting at the rightmost index.
288
-	 *
289
-	 * @param callable $callable
290
-	 * @param null     $initial
291
-	 * @return mixed
292
-	 */
293
-	public function reduce_right( $callable, $initial = null );
294
-
295
-	/**
296
-	 * Randomly reorders the elements in the collection.
297
-	 *
298
-	 * @return Collection
299
-	 */
300
-	public function shuffle();
301
-
302
-	/**
303
-	 * Adds every member of $elements to the collection.
304
-	 *
305
-	 * @param array|Collection $elements Array of elements to merge.
306
-	 * @return Collection
307
-	 * @throws InvalidArgumentException
308
-	 */
309
-	public function merge( $elements );
310
-
311
-	/**
312
-	 * Get first element of the collection
313
-	 *
314
-	 * @return mixed
315
-	 * @throws OutOfBoundsException
316
-	 */
317
-	public function first();
318
-
319
-	/**
320
-	 * Get last element of the collection
321
-	 *
322
-	 * @return mixed
323
-	 * @throws OutOfBoundsException
324
-	 */
325
-	public function last();
12
+    /**
13
+     * Returns the type of the collection.
14
+     *
15
+     * @return string
16
+     */
17
+    public function get_type();
18
+
19
+    /**
20
+     * Returns a collection with $element added.
21
+     *
22
+     * @param  mixed $element
23
+     * @return Collection
24
+     * @throws InvalidArgumentException
25
+     */
26
+    public function add( $element );
27
+
28
+    /**
29
+     * Removes every element from the collection.
30
+     *
31
+     * @return Collection
32
+     */
33
+    public function clear();
34
+
35
+    /**
36
+     * Returns true if the collection contains any elements that satisfy
37
+     * $condition, returns false if it contains none.
38
+     *
39
+     * @param callable $condition
40
+     * @return bool
41
+     */
42
+    public function contains( $condition );
43
+
44
+    /**
45
+     * Returns the first element in the collection that satisfies
46
+     * $condition, returns false if no such element exists.
47
+     *
48
+     * @param callable $condition
49
+     * @return mixed
50
+     */
51
+    public function find( $condition );
52
+
53
+    /**
54
+     * Returns the index of the first element in the collection that satisfies
55
+     * $condition, returns -1 if no such element exists.
56
+     *
57
+     * @param callable $condition
58
+     * @return int
59
+     */
60
+    public function find_index( $condition );
61
+
62
+    /**
63
+     * Returns the element in the collection at $index.
64
+     *
65
+     * @param  int $index Index to get element from.
66
+     * @return mixed
67
+     * @throws OutOfRangeException
68
+     */
69
+    public function at( $index );
70
+
71
+    /**
72
+     * Returns true if $index is within the collection's range and returns false
73
+     * if it is not.
74
+     *
75
+     * @param  int $index Index to check for existence.
76
+     * @return bool
77
+     * @throws InvalidArgumentException
78
+     */
79
+    public function index_exists( $index );
80
+
81
+    /**
82
+     * Returns the number of elements in the collection.
83
+     *
84
+     * @return int
85
+     */
86
+    public function count();
87
+
88
+    /**
89
+     * Returns a collection that only contains the elements which satisfy
90
+     * $condition.
91
+     *
92
+     * @param callable $condition
93
+     * @return Collection
94
+     */
95
+    public function filter( $condition );
96
+
97
+    /**
98
+     * Returns the last element in the collection that satisfies $condition,
99
+     * returns false if no such element exists.
100
+     *
101
+     * @param callable $condition
102
+     * @return mixed
103
+     */
104
+    public function find_last( $condition );
105
+
106
+    /**
107
+     * Returns the index of the last element in the collection that satisfies
108
+     * $condition, returns -1 if no such element exists.
109
+     *
110
+     * @param callable $condition
111
+     * @return int
112
+     */
113
+    public function find_last_index( $condition );
114
+
115
+    /**
116
+     * Returns a collection that contains the subset of elements ranging from the
117
+     * index $start to $end.
118
+     *
119
+     * @param  int $start Begining index to slice from.
120
+     * @param  int $end   End index to slice to.
121
+     * @return Collection
122
+     * @throws InvalidArgumentException
123
+     */
124
+    public function slice( $start, $end );
125
+
126
+    /**
127
+     * Inserts $element at $index.
128
+     *
129
+     * @param int   $index     Index to start at.
130
+     * @param mixed $element Element to insert.
131
+     * @return Collection
132
+     * @throws InvalidArgumentException
133
+     * @throws OutOfRangeException
134
+     */
135
+    public function insert( $index, $element );
136
+
137
+    /**
138
+     * Inserts the range $elements at $index.
139
+     *
140
+     * @param int   $index
141
+     * @param array $elements
142
+     * @return Collection
143
+     * @throws OutOfRangeException
144
+     */
145
+    public function insert_range( $index, array $elements );
146
+
147
+    /**
148
+     * Removes all of the elements that satisfy $condition.
149
+     *
150
+     * @param  callable $condition
151
+     * @return Collection
152
+     */
153
+    public function reject( $condition );
154
+
155
+    /**
156
+     * Removes the element at $index.
157
+     *
158
+     * @param  int $index Index to remove.
159
+     * @return Collection
160
+     * @throws OutOfRangeException
161
+     */
162
+    public function remove_at( $index );
163
+
164
+    /**
165
+     * Reverses the order of the elements in the collection.
166
+     *
167
+     * @return Collection
168
+     */
169
+    public function reverse();
170
+
171
+    /**
172
+     * Sorts the elements in the collection using the user supplied comparison
173
+     * function $callback.
174
+     *
175
+     * @param callable $callback
176
+     * @return Collection
177
+     */
178
+    public function sort( $callback );
179
+
180
+    /**
181
+     * Returns an array containing the elements in the collection.
182
+     *
183
+     * @return array
184
+     */
185
+    public function to_array();
186
+
187
+    /**
188
+     * Iteratively reduces the collection to a single value using the callback
189
+     * function $callable.
190
+     *
191
+     * @param callable $callable
192
+     * @param null     $initial
193
+     * @return mixed
194
+     */
195
+    public function reduce( $callable, $initial = null );
196
+
197
+    /**
198
+     * Returns true if every element in the collection satisfies $condition,
199
+     * returns false if not.
200
+     *
201
+     * @param callable $condition
202
+     * @return bool
203
+     */
204
+    public function every( $condition );
205
+
206
+    /**
207
+     * Removes all of the elements in the collection starting at index $num.
208
+     *
209
+     * @param  int $num Number of elements to drop.
210
+     * @return Collection
211
+     * @throws InvalidArgumentException
212
+     */
213
+    public function drop( $num );
214
+
215
+    /**
216
+     * Removes all of the elements in the collectioin between index 0 and $num.
217
+     *
218
+     * @param int $num Number of elements to drop.
219
+     * @return Collection
220
+     * @throws InvalidArgumentException
221
+     */
222
+    public function drop_right( $num );
223
+
224
+    /**
225
+     * Iteratively drops elements in the collection that satisfy $condition until
226
+     * an element is encountered that does not satisfy $condition.
227
+     *
228
+     * @param callable $condition
229
+     * @return Collection
230
+     */
231
+    public function drop_while( $condition );
232
+
233
+    /**
234
+     * Removes the first element in the collection.
235
+     *
236
+     * @return Collection
237
+     * @throws InvalidArgumentException
238
+     */
239
+    public function tail();
240
+
241
+    /**
242
+     * Removes all of the elements in the collection starting at index $num.
243
+     *
244
+     * @param  int $num Number of elements to take.
245
+     * @return Collection
246
+     * @throws InvalidArgumentException
247
+     */
248
+    public function take( $num );
249
+
250
+    /**
251
+     * Removes all of the elements in the collection before index $num.
252
+     *
253
+     * @param int $num Number of elements to take.
254
+     * @return Collection
255
+     * @throws InvalidArgumentException
256
+     */
257
+    public function take_right( $num );
258
+
259
+    /**
260
+     * Iterates through the collection until an element is encountered that does
261
+     * not satisfy $condition, then drops all of the elements starting at that
262
+     * index.
263
+     *
264
+     * @param callable $condition
265
+     * @return Collection
266
+     */
267
+    public function take_while( $condition );
268
+
269
+    /**
270
+     * Applies the callback function $callable to each element in the collection.
271
+     *
272
+     * @param callable $callable
273
+     */
274
+    public function each( $callable );
275
+
276
+    /**
277
+     * Returns a new instance of the collection with the callback function
278
+     * $callable applied to each element.
279
+     *
280
+     * @param callable $callable
281
+     * @return Collection
282
+     */
283
+    public function map( $callable );
284
+
285
+    /**
286
+     * Iteratively reduces the collection to a single value using the callback
287
+     * function $callable starting at the rightmost index.
288
+     *
289
+     * @param callable $callable
290
+     * @param null     $initial
291
+     * @return mixed
292
+     */
293
+    public function reduce_right( $callable, $initial = null );
294
+
295
+    /**
296
+     * Randomly reorders the elements in the collection.
297
+     *
298
+     * @return Collection
299
+     */
300
+    public function shuffle();
301
+
302
+    /**
303
+     * Adds every member of $elements to the collection.
304
+     *
305
+     * @param array|Collection $elements Array of elements to merge.
306
+     * @return Collection
307
+     * @throws InvalidArgumentException
308
+     */
309
+    public function merge( $elements );
310
+
311
+    /**
312
+     * Get first element of the collection
313
+     *
314
+     * @return mixed
315
+     * @throws OutOfBoundsException
316
+     */
317
+    public function first();
318
+
319
+    /**
320
+     * Get last element of the collection
321
+     *
322
+     * @return mixed
323
+     * @throws OutOfBoundsException
324
+     */
325
+    public function last();
326 326
 }
Please login to merge, or discard this patch.
Spacing   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
 	 * @return Collection
24 24
 	 * @throws InvalidArgumentException
25 25
 	 */
26
-	public function add( $element );
26
+	public function add($element);
27 27
 
28 28
 	/**
29 29
 	 * Removes every element from the collection.
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
 	 * @param callable $condition
40 40
 	 * @return bool
41 41
 	 */
42
-	public function contains( $condition );
42
+	public function contains($condition);
43 43
 
44 44
 	/**
45 45
 	 * Returns the first element in the collection that satisfies
@@ -48,7 +48,7 @@  discard block
 block discarded – undo
48 48
 	 * @param callable $condition
49 49
 	 * @return mixed
50 50
 	 */
51
-	public function find( $condition );
51
+	public function find($condition);
52 52
 
53 53
 	/**
54 54
 	 * Returns the index of the first element in the collection that satisfies
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
 	 * @param callable $condition
58 58
 	 * @return int
59 59
 	 */
60
-	public function find_index( $condition );
60
+	public function find_index($condition);
61 61
 
62 62
 	/**
63 63
 	 * Returns the element in the collection at $index.
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
 	 * @return mixed
67 67
 	 * @throws OutOfRangeException
68 68
 	 */
69
-	public function at( $index );
69
+	public function at($index);
70 70
 
71 71
 	/**
72 72
 	 * Returns true if $index is within the collection's range and returns false
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
 	 * @return bool
77 77
 	 * @throws InvalidArgumentException
78 78
 	 */
79
-	public function index_exists( $index );
79
+	public function index_exists($index);
80 80
 
81 81
 	/**
82 82
 	 * Returns the number of elements in the collection.
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 	 * @param callable $condition
93 93
 	 * @return Collection
94 94
 	 */
95
-	public function filter( $condition );
95
+	public function filter($condition);
96 96
 
97 97
 	/**
98 98
 	 * Returns the last element in the collection that satisfies $condition,
@@ -101,7 +101,7 @@  discard block
 block discarded – undo
101 101
 	 * @param callable $condition
102 102
 	 * @return mixed
103 103
 	 */
104
-	public function find_last( $condition );
104
+	public function find_last($condition);
105 105
 
106 106
 	/**
107 107
 	 * Returns the index of the last element in the collection that satisfies
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
 	 * @param callable $condition
111 111
 	 * @return int
112 112
 	 */
113
-	public function find_last_index( $condition );
113
+	public function find_last_index($condition);
114 114
 
115 115
 	/**
116 116
 	 * Returns a collection that contains the subset of elements ranging from the
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 	 * @return Collection
122 122
 	 * @throws InvalidArgumentException
123 123
 	 */
124
-	public function slice( $start, $end );
124
+	public function slice($start, $end);
125 125
 
126 126
 	/**
127 127
 	 * Inserts $element at $index.
@@ -132,7 +132,7 @@  discard block
 block discarded – undo
132 132
 	 * @throws InvalidArgumentException
133 133
 	 * @throws OutOfRangeException
134 134
 	 */
135
-	public function insert( $index, $element );
135
+	public function insert($index, $element);
136 136
 
137 137
 	/**
138 138
 	 * Inserts the range $elements at $index.
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
 	 * @return Collection
143 143
 	 * @throws OutOfRangeException
144 144
 	 */
145
-	public function insert_range( $index, array $elements );
145
+	public function insert_range($index, array $elements);
146 146
 
147 147
 	/**
148 148
 	 * Removes all of the elements that satisfy $condition.
@@ -150,7 +150,7 @@  discard block
 block discarded – undo
150 150
 	 * @param  callable $condition
151 151
 	 * @return Collection
152 152
 	 */
153
-	public function reject( $condition );
153
+	public function reject($condition);
154 154
 
155 155
 	/**
156 156
 	 * Removes the element at $index.
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
 	 * @return Collection
160 160
 	 * @throws OutOfRangeException
161 161
 	 */
162
-	public function remove_at( $index );
162
+	public function remove_at($index);
163 163
 
164 164
 	/**
165 165
 	 * Reverses the order of the elements in the collection.
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
 	 * @param callable $callback
176 176
 	 * @return Collection
177 177
 	 */
178
-	public function sort( $callback );
178
+	public function sort($callback);
179 179
 
180 180
 	/**
181 181
 	 * Returns an array containing the elements in the collection.
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
 	 * @param null     $initial
193 193
 	 * @return mixed
194 194
 	 */
195
-	public function reduce( $callable, $initial = null );
195
+	public function reduce($callable, $initial = null);
196 196
 
197 197
 	/**
198 198
 	 * Returns true if every element in the collection satisfies $condition,
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
 	 * @param callable $condition
202 202
 	 * @return bool
203 203
 	 */
204
-	public function every( $condition );
204
+	public function every($condition);
205 205
 
206 206
 	/**
207 207
 	 * Removes all of the elements in the collection starting at index $num.
@@ -210,7 +210,7 @@  discard block
 block discarded – undo
210 210
 	 * @return Collection
211 211
 	 * @throws InvalidArgumentException
212 212
 	 */
213
-	public function drop( $num );
213
+	public function drop($num);
214 214
 
215 215
 	/**
216 216
 	 * Removes all of the elements in the collectioin between index 0 and $num.
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 	 * @return Collection
220 220
 	 * @throws InvalidArgumentException
221 221
 	 */
222
-	public function drop_right( $num );
222
+	public function drop_right($num);
223 223
 
224 224
 	/**
225 225
 	 * Iteratively drops elements in the collection that satisfy $condition until
@@ -228,7 +228,7 @@  discard block
 block discarded – undo
228 228
 	 * @param callable $condition
229 229
 	 * @return Collection
230 230
 	 */
231
-	public function drop_while( $condition );
231
+	public function drop_while($condition);
232 232
 
233 233
 	/**
234 234
 	 * Removes the first element in the collection.
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
 	 * @return Collection
246 246
 	 * @throws InvalidArgumentException
247 247
 	 */
248
-	public function take( $num );
248
+	public function take($num);
249 249
 
250 250
 	/**
251 251
 	 * Removes all of the elements in the collection before index $num.
@@ -254,7 +254,7 @@  discard block
 block discarded – undo
254 254
 	 * @return Collection
255 255
 	 * @throws InvalidArgumentException
256 256
 	 */
257
-	public function take_right( $num );
257
+	public function take_right($num);
258 258
 
259 259
 	/**
260 260
 	 * Iterates through the collection until an element is encountered that does
@@ -264,14 +264,14 @@  discard block
 block discarded – undo
264 264
 	 * @param callable $condition
265 265
 	 * @return Collection
266 266
 	 */
267
-	public function take_while( $condition );
267
+	public function take_while($condition);
268 268
 
269 269
 	/**
270 270
 	 * Applies the callback function $callable to each element in the collection.
271 271
 	 *
272 272
 	 * @param callable $callable
273 273
 	 */
274
-	public function each( $callable );
274
+	public function each($callable);
275 275
 
276 276
 	/**
277 277
 	 * Returns a new instance of the collection with the callback function
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
 	 * @param callable $callable
281 281
 	 * @return Collection
282 282
 	 */
283
-	public function map( $callable );
283
+	public function map($callable);
284 284
 
285 285
 	/**
286 286
 	 * Iteratively reduces the collection to a single value using the callback
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
 	 * @param null     $initial
291 291
 	 * @return mixed
292 292
 	 */
293
-	public function reduce_right( $callable, $initial = null );
293
+	public function reduce_right($callable, $initial = null);
294 294
 
295 295
 	/**
296 296
 	 * Randomly reorders the elements in the collection.
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
 	 * @return Collection
307 307
 	 * @throws InvalidArgumentException
308 308
 	 */
309
-	public function merge( $elements );
309
+	public function merge($elements);
310 310
 
311 311
 	/**
312 312
 	 * Get first element of the collection
Please login to merge, or discard this patch.
src/Contract/Axolotl/Dictionary.php 2 patches
Indentation   +174 added lines, -174 removed lines patch added patch discarded remove patch
@@ -5,178 +5,178 @@
 block discarded – undo
5 5
 use Iterator;
6 6
 
7 7
 interface Dictionary extends Iterator, Countable, Serializes {
8
-	/**
9
-	 * Returns the type of the dictionary's keys.
10
-	 *
11
-	 * @return string
12
-	 */
13
-	public function get_key_type();
14
-
15
-	/**
16
-	 * Returns the type of the dictionary's values.
17
-	 *
18
-	 * @return string
19
-	 */
20
-	public function get_value_type();
21
-
22
-	/**
23
-	 * Returns true if $key is in the dictionary, returns false if it is not.
24
-	 *
25
-	 * @param mixed $key Key to check for.
26
-	 *
27
-	 * @return bool
28
-	 */
29
-	public function exists( $key );
30
-
31
-	/**
32
-	 * Returns true if the callable returns true. The callable should accept a
33
-	 * key and value as arguments and return a boolean.
34
-	 *
35
-	 * @param  callable $callable
36
-	 * @return bool
37
-	 */
38
-	public function contains( $callable );
39
-
40
-	/**
41
-	 * Returns the value associated with $key.
42
-	 *
43
-	 * @param mixed $key Key to get.
44
-	 *
45
-	 * @return mixed
46
-	 */
47
-	public function get( $key );
48
-
49
-	/**
50
-	 * Removes the key-value pair represented by $key from the dictionary.
51
-	 *
52
-	 * @param mixed $key Key to remove.
53
-	 *
54
-	 * @return static
55
-	 */
56
-	public function delete( $key );
57
-
58
-	/**
59
-	 * Returns true if $value is in the dictionary, returns false if not.
60
-	 *
61
-	 * @param mixed $value Value to check for existence.
62
-	 *
63
-	 * @return bool
64
-	 */
65
-	public function value_exists( $value );
66
-
67
-	/**
68
-	 * Returns the number of key-value pairs in the dictionary.
69
-	 *
70
-	 * @return int
71
-	 */
72
-	public function count();
73
-
74
-	/**
75
-	 * Removes every key-value pair from the dictionary.
76
-	 *
77
-	 * @return static
78
-	 */
79
-	public function clear();
80
-
81
-	/**
82
-	 * Returns the key-value pairs in the dictionary as an associative array.
83
-	 *
84
-	 * @return array
85
-	 */
86
-	public function to_array();
87
-
88
-	/**
89
-	 * Returns a dictionary that only contains the key-value pairs which satisfy
90
-	 * $condition.
91
-	 *
92
-	 * @param callable $condition
93
-	 *
94
-	 * @return static
95
-	 */
96
-	public function filter( $condition );
97
-
98
-	/**
99
-	 * Removes all key-value pairs from the Dictionary that do not satisfy
100
-	 * $condition.
101
-	 *
102
-	 * @param callable $condition
103
-	 *
104
-	 * @return Dictionary
105
-	 */
106
-	public function reject( $condition );
107
-
108
-	/**
109
-	 * Adds the key-value pair containing $key and $value to the dictionary.
110
-	 *
111
-	 * @param mixed $key   Key to add.
112
-	 * @param mixed $value Value to add.
113
-	 *
114
-	 * @return Dictionary
115
-	 * @throws \InvalidArgumentException
116
-	 */
117
-	public function add( $key, $value );
118
-
119
-	/**
120
-	 * Applies the callback function $callable to each key-value pair in the
121
-	 * dictionary.
122
-	 *
123
-	 * @param callable $callable
124
-	 */
125
-	public function each( $callable );
126
-
127
-	/**
128
-	 * Returns the value associated with $key in the dictionary, returns
129
-	 * $default if it does not.
130
-	 *
131
-	 * @param mixed $key     Key to fetch.
132
-	 * @param mixed $default Default value if key is not found.
133
-	 *
134
-	 * @return mixed
135
-	 */
136
-	public function get_or_else( $key, $default );
137
-
138
-	/**
139
-	 * Returns an array of all keys in the dictionary.
140
-	 *
141
-	 * @return array
142
-	 */
143
-	public function keys();
144
-
145
-	/**
146
-	 * Returns an array of all values in the dictionary.
147
-	 *
148
-	 * @return array
149
-	 */
150
-	public function values();
151
-
152
-	/**
153
-	 * Returns a new dictionary with the callback function $callable applied to
154
-	 * every key-value pair in the dictionary.
155
-	 *
156
-	 * @param callable $callable
157
-	 *
158
-	 * @return static
159
-	 */
160
-	public function map( $callable );
161
-
162
-	/**
163
-	 * Adds every key-value pair in $storage to the dictionary.
164
-	 *
165
-	 * @param array|Dictionary $source Storage object to merge.
166
-	 *
167
-	 * @return static
168
-	 */
169
-	public function merge( $source );
170
-
171
-
172
-	/**
173
-	 * Reduce the dictionary to a single value. The callable should contain
174
-	 * args: carry, key, value
175
-	 *
176
-	 * @param callable $callable
177
-	 * @param mixed    $initial
178
-	 *
179
-	 * @return mixed
180
-	 */
181
-	public function reduce( $callable, $initial );
8
+    /**
9
+     * Returns the type of the dictionary's keys.
10
+     *
11
+     * @return string
12
+     */
13
+    public function get_key_type();
14
+
15
+    /**
16
+     * Returns the type of the dictionary's values.
17
+     *
18
+     * @return string
19
+     */
20
+    public function get_value_type();
21
+
22
+    /**
23
+     * Returns true if $key is in the dictionary, returns false if it is not.
24
+     *
25
+     * @param mixed $key Key to check for.
26
+     *
27
+     * @return bool
28
+     */
29
+    public function exists( $key );
30
+
31
+    /**
32
+     * Returns true if the callable returns true. The callable should accept a
33
+     * key and value as arguments and return a boolean.
34
+     *
35
+     * @param  callable $callable
36
+     * @return bool
37
+     */
38
+    public function contains( $callable );
39
+
40
+    /**
41
+     * Returns the value associated with $key.
42
+     *
43
+     * @param mixed $key Key to get.
44
+     *
45
+     * @return mixed
46
+     */
47
+    public function get( $key );
48
+
49
+    /**
50
+     * Removes the key-value pair represented by $key from the dictionary.
51
+     *
52
+     * @param mixed $key Key to remove.
53
+     *
54
+     * @return static
55
+     */
56
+    public function delete( $key );
57
+
58
+    /**
59
+     * Returns true if $value is in the dictionary, returns false if not.
60
+     *
61
+     * @param mixed $value Value to check for existence.
62
+     *
63
+     * @return bool
64
+     */
65
+    public function value_exists( $value );
66
+
67
+    /**
68
+     * Returns the number of key-value pairs in the dictionary.
69
+     *
70
+     * @return int
71
+     */
72
+    public function count();
73
+
74
+    /**
75
+     * Removes every key-value pair from the dictionary.
76
+     *
77
+     * @return static
78
+     */
79
+    public function clear();
80
+
81
+    /**
82
+     * Returns the key-value pairs in the dictionary as an associative array.
83
+     *
84
+     * @return array
85
+     */
86
+    public function to_array();
87
+
88
+    /**
89
+     * Returns a dictionary that only contains the key-value pairs which satisfy
90
+     * $condition.
91
+     *
92
+     * @param callable $condition
93
+     *
94
+     * @return static
95
+     */
96
+    public function filter( $condition );
97
+
98
+    /**
99
+     * Removes all key-value pairs from the Dictionary that do not satisfy
100
+     * $condition.
101
+     *
102
+     * @param callable $condition
103
+     *
104
+     * @return Dictionary
105
+     */
106
+    public function reject( $condition );
107
+
108
+    /**
109
+     * Adds the key-value pair containing $key and $value to the dictionary.
110
+     *
111
+     * @param mixed $key   Key to add.
112
+     * @param mixed $value Value to add.
113
+     *
114
+     * @return Dictionary
115
+     * @throws \InvalidArgumentException
116
+     */
117
+    public function add( $key, $value );
118
+
119
+    /**
120
+     * Applies the callback function $callable to each key-value pair in the
121
+     * dictionary.
122
+     *
123
+     * @param callable $callable
124
+     */
125
+    public function each( $callable );
126
+
127
+    /**
128
+     * Returns the value associated with $key in the dictionary, returns
129
+     * $default if it does not.
130
+     *
131
+     * @param mixed $key     Key to fetch.
132
+     * @param mixed $default Default value if key is not found.
133
+     *
134
+     * @return mixed
135
+     */
136
+    public function get_or_else( $key, $default );
137
+
138
+    /**
139
+     * Returns an array of all keys in the dictionary.
140
+     *
141
+     * @return array
142
+     */
143
+    public function keys();
144
+
145
+    /**
146
+     * Returns an array of all values in the dictionary.
147
+     *
148
+     * @return array
149
+     */
150
+    public function values();
151
+
152
+    /**
153
+     * Returns a new dictionary with the callback function $callable applied to
154
+     * every key-value pair in the dictionary.
155
+     *
156
+     * @param callable $callable
157
+     *
158
+     * @return static
159
+     */
160
+    public function map( $callable );
161
+
162
+    /**
163
+     * Adds every key-value pair in $storage to the dictionary.
164
+     *
165
+     * @param array|Dictionary $source Storage object to merge.
166
+     *
167
+     * @return static
168
+     */
169
+    public function merge( $source );
170
+
171
+
172
+    /**
173
+     * Reduce the dictionary to a single value. The callable should contain
174
+     * args: carry, key, value
175
+     *
176
+     * @param callable $callable
177
+     * @param mixed    $initial
178
+     *
179
+     * @return mixed
180
+     */
181
+    public function reduce( $callable, $initial );
182 182
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
 	 *
27 27
 	 * @return bool
28 28
 	 */
29
-	public function exists( $key );
29
+	public function exists($key);
30 30
 
31 31
 	/**
32 32
 	 * Returns true if the callable returns true. The callable should accept a
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 	 * @param  callable $callable
36 36
 	 * @return bool
37 37
 	 */
38
-	public function contains( $callable );
38
+	public function contains($callable);
39 39
 
40 40
 	/**
41 41
 	 * Returns the value associated with $key.
@@ -44,7 +44,7 @@  discard block
 block discarded – undo
44 44
 	 *
45 45
 	 * @return mixed
46 46
 	 */
47
-	public function get( $key );
47
+	public function get($key);
48 48
 
49 49
 	/**
50 50
 	 * Removes the key-value pair represented by $key from the dictionary.
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
53 53
 	 *
54 54
 	 * @return static
55 55
 	 */
56
-	public function delete( $key );
56
+	public function delete($key);
57 57
 
58 58
 	/**
59 59
 	 * Returns true if $value is in the dictionary, returns false if not.
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
 	 *
63 63
 	 * @return bool
64 64
 	 */
65
-	public function value_exists( $value );
65
+	public function value_exists($value);
66 66
 
67 67
 	/**
68 68
 	 * Returns the number of key-value pairs in the dictionary.
@@ -93,7 +93,7 @@  discard block
 block discarded – undo
93 93
 	 *
94 94
 	 * @return static
95 95
 	 */
96
-	public function filter( $condition );
96
+	public function filter($condition);
97 97
 
98 98
 	/**
99 99
 	 * Removes all key-value pairs from the Dictionary that do not satisfy
@@ -103,7 +103,7 @@  discard block
 block discarded – undo
103 103
 	 *
104 104
 	 * @return Dictionary
105 105
 	 */
106
-	public function reject( $condition );
106
+	public function reject($condition);
107 107
 
108 108
 	/**
109 109
 	 * Adds the key-value pair containing $key and $value to the dictionary.
@@ -114,7 +114,7 @@  discard block
 block discarded – undo
114 114
 	 * @return Dictionary
115 115
 	 * @throws \InvalidArgumentException
116 116
 	 */
117
-	public function add( $key, $value );
117
+	public function add($key, $value);
118 118
 
119 119
 	/**
120 120
 	 * Applies the callback function $callable to each key-value pair in the
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
 	 *
123 123
 	 * @param callable $callable
124 124
 	 */
125
-	public function each( $callable );
125
+	public function each($callable);
126 126
 
127 127
 	/**
128 128
 	 * Returns the value associated with $key in the dictionary, returns
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
 	 *
134 134
 	 * @return mixed
135 135
 	 */
136
-	public function get_or_else( $key, $default );
136
+	public function get_or_else($key, $default);
137 137
 
138 138
 	/**
139 139
 	 * Returns an array of all keys in the dictionary.
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
 	 *
158 158
 	 * @return static
159 159
 	 */
160
-	public function map( $callable );
160
+	public function map($callable);
161 161
 
162 162
 	/**
163 163
 	 * Adds every key-value pair in $storage to the dictionary.
@@ -166,7 +166,7 @@  discard block
 block discarded – undo
166 166
 	 *
167 167
 	 * @return static
168 168
 	 */
169
-	public function merge( $source );
169
+	public function merge($source);
170 170
 
171 171
 
172 172
 	/**
@@ -178,5 +178,5 @@  discard block
 block discarded – undo
178 178
 	 *
179 179
 	 * @return mixed
180 180
 	 */
181
-	public function reduce( $callable, $initial );
181
+	public function reduce($callable, $initial);
182 182
 }
Please login to merge, or discard this patch.
src/Axolotl/Type.php 2 patches
Indentation   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -15,158 +15,158 @@
 block discarded – undo
15 15
  */
16 16
 class Type {
17 17
 
18
-	/**
19
-	 * Type to validate against.
20
-	 *
21
-	 * @var string
22
-	 */
23
-	private $type;
24
-
25
-	/**
26
-	 * Type constructor.
27
-	 *
28
-	 * @param string $type
29
-	 * @param bool   $key_type
30
-	 */
31
-	public function __construct( $type, $key_type = false ) {
32
-		$this->type = $this->determine( $type, $key_type );
33
-	}
34
-
35
-	/**
36
-	 * Get validation type.
37
-	 *
38
-	 * @return string
39
-	 */
40
-	public function get_type() {
41
-		return $this->type;
42
-	}
43
-
44
-	/**
45
-	 * Returns whether the type is an Axolotl model.
46
-	 *
47
-	 * @return bool
48
-	 */
49
-	public function is_model() {
50
-		if ( ! class_exists( $this->type ) ) {
51
-			return false;
52
-		}
53
-
54
-		$reflection = new ReflectionClass( $this->type );
55
-		return $reflection->isSubclassOf( 'Intraxia\Jaxion\Axolotl\Model' );
56
-	}
57
-
58
-	/**
59
-	 * Create a new model from the given data.
60
-	 *
61
-	 * @param array $data Data for the model.
62
-	 *
63
-	 * @return Model
64
-	 */
65
-	public function create_model( array $data ) {
66
-		return new $this->type( $data );
67
-	}
68
-
69
-	/**
70
-	 * Validates an array of element.
71
-	 *
72
-	 * @param array $elements Elements to be validated.
73
-	 *
74
-	 * @throws InvalidArgumentException
75
-	 */
76
-	public function validate_elements( array $elements ) {
77
-		foreach ( $elements as $element ) {
78
-			$this->validate_element( $element );
79
-		}
80
-	}
81
-
82
-	/**
83
-	 * Validate whether the
84
-	 *
85
-	 * @param mixed $element Element to validate.
86
-	 *
87
-	 * @throws InvalidArgumentException
88
-	 */
89
-	public function validate_element( $element ) {
90
-		$type = gettype( $element );
91
-		$callable = $this->type === 'callable';
92
-		$is_object = 'object' === $type;
93
-		$loose_check = $this->type === 'object';
94
-
95
-		// callable must be callable
96
-		if ( $callable && ! is_callable( $element ) ) {
97
-			throw new InvalidArgumentException( 'Item must be callable' );
98
-		}
99
-
100
-		// target isn't callable, object must be an instance of target
101
-		if ( ! $loose_check && ! $callable && $is_object && ! is_a( $element, $this->type ) ) {
102
-			throw new InvalidArgumentException( "Item is not type or subtype of $this->type" );
103
-		}
104
-
105
-		// a non callable, non object type should match the target string
106
-		if ( ! $callable && ! $is_object && $type !== $this->type ) {
107
-			throw new InvalidArgumentException( "Item is not of type: $this->type" );
108
-		}
109
-	}
110
-
111
-	/**
112
-	 * Determine the type to validate against.
113
-	 *
114
-	 * @param string $type     Type to determine.
115
-	 * @param bool   $key_type Whether the type is for keys.
116
-	 *
117
-	 * @return string
118
-	 *
119
-	 * @throws InvalidArgumentException
120
-	 */
121
-	private function determine( $type, $key_type = false ) {
122
-		if ( ! $key_type && $this->non_scalar_type_exists( $type ) ) {
123
-			return $type;
124
-		}
125
-
126
-		if ( $scalar_type = $this->determine_scalar( $type ) ) {
127
-			if ( $key_type && (in_array( $scalar_type, array( 'double', 'boolean' ) )) ) {
128
-				throw new InvalidArgumentException( 'This type is not supported as a key.' );
129
-			}
130
-
131
-			return $scalar_type;
132
-		}
133
-
134
-		throw new InvalidArgumentException( 'This type does not exist.' );
135
-	}
136
-
137
-	/**
138
-	 * Determines whether the given type exists.
139
-	 *
140
-	 * @param string $type Type to check.
141
-	 *
142
-	 * @return bool
143
-	 */
144
-	private function non_scalar_type_exists( $type ) {
145
-		return class_exists( $type )
146
-				|| interface_exists( $type )
147
-				|| in_array( $type, array( 'array', 'object', 'callable' ) );
148
-	}
149
-
150
-	/**
151
-	 * Returns the type if it's scalar, otherwise, returns null.
152
-	 *
153
-	 * @param string $type Type to check.
154
-	 *
155
-	 * @return string|null
156
-	 */
157
-	private function determine_scalar( $type ) {
158
-		$synonyms = array(
159
-			'int' => 'integer',
160
-			'float' => 'double',
161
-			'bool' => 'boolean',
162
-		);
163
-
164
-		if ( array_key_exists( $type, $synonyms ) ) {
165
-			$type = $synonyms[ $type ];
166
-		}
167
-
168
-		return in_array( $type, array( 'string', 'integer', 'double', 'boolean' ) ) ?
169
-			$type :
170
-			null;
171
-	}
18
+    /**
19
+     * Type to validate against.
20
+     *
21
+     * @var string
22
+     */
23
+    private $type;
24
+
25
+    /**
26
+     * Type constructor.
27
+     *
28
+     * @param string $type
29
+     * @param bool   $key_type
30
+     */
31
+    public function __construct( $type, $key_type = false ) {
32
+        $this->type = $this->determine( $type, $key_type );
33
+    }
34
+
35
+    /**
36
+     * Get validation type.
37
+     *
38
+     * @return string
39
+     */
40
+    public function get_type() {
41
+        return $this->type;
42
+    }
43
+
44
+    /**
45
+     * Returns whether the type is an Axolotl model.
46
+     *
47
+     * @return bool
48
+     */
49
+    public function is_model() {
50
+        if ( ! class_exists( $this->type ) ) {
51
+            return false;
52
+        }
53
+
54
+        $reflection = new ReflectionClass( $this->type );
55
+        return $reflection->isSubclassOf( 'Intraxia\Jaxion\Axolotl\Model' );
56
+    }
57
+
58
+    /**
59
+     * Create a new model from the given data.
60
+     *
61
+     * @param array $data Data for the model.
62
+     *
63
+     * @return Model
64
+     */
65
+    public function create_model( array $data ) {
66
+        return new $this->type( $data );
67
+    }
68
+
69
+    /**
70
+     * Validates an array of element.
71
+     *
72
+     * @param array $elements Elements to be validated.
73
+     *
74
+     * @throws InvalidArgumentException
75
+     */
76
+    public function validate_elements( array $elements ) {
77
+        foreach ( $elements as $element ) {
78
+            $this->validate_element( $element );
79
+        }
80
+    }
81
+
82
+    /**
83
+     * Validate whether the
84
+     *
85
+     * @param mixed $element Element to validate.
86
+     *
87
+     * @throws InvalidArgumentException
88
+     */
89
+    public function validate_element( $element ) {
90
+        $type = gettype( $element );
91
+        $callable = $this->type === 'callable';
92
+        $is_object = 'object' === $type;
93
+        $loose_check = $this->type === 'object';
94
+
95
+        // callable must be callable
96
+        if ( $callable && ! is_callable( $element ) ) {
97
+            throw new InvalidArgumentException( 'Item must be callable' );
98
+        }
99
+
100
+        // target isn't callable, object must be an instance of target
101
+        if ( ! $loose_check && ! $callable && $is_object && ! is_a( $element, $this->type ) ) {
102
+            throw new InvalidArgumentException( "Item is not type or subtype of $this->type" );
103
+        }
104
+
105
+        // a non callable, non object type should match the target string
106
+        if ( ! $callable && ! $is_object && $type !== $this->type ) {
107
+            throw new InvalidArgumentException( "Item is not of type: $this->type" );
108
+        }
109
+    }
110
+
111
+    /**
112
+     * Determine the type to validate against.
113
+     *
114
+     * @param string $type     Type to determine.
115
+     * @param bool   $key_type Whether the type is for keys.
116
+     *
117
+     * @return string
118
+     *
119
+     * @throws InvalidArgumentException
120
+     */
121
+    private function determine( $type, $key_type = false ) {
122
+        if ( ! $key_type && $this->non_scalar_type_exists( $type ) ) {
123
+            return $type;
124
+        }
125
+
126
+        if ( $scalar_type = $this->determine_scalar( $type ) ) {
127
+            if ( $key_type && (in_array( $scalar_type, array( 'double', 'boolean' ) )) ) {
128
+                throw new InvalidArgumentException( 'This type is not supported as a key.' );
129
+            }
130
+
131
+            return $scalar_type;
132
+        }
133
+
134
+        throw new InvalidArgumentException( 'This type does not exist.' );
135
+    }
136
+
137
+    /**
138
+     * Determines whether the given type exists.
139
+     *
140
+     * @param string $type Type to check.
141
+     *
142
+     * @return bool
143
+     */
144
+    private function non_scalar_type_exists( $type ) {
145
+        return class_exists( $type )
146
+                || interface_exists( $type )
147
+                || in_array( $type, array( 'array', 'object', 'callable' ) );
148
+    }
149
+
150
+    /**
151
+     * Returns the type if it's scalar, otherwise, returns null.
152
+     *
153
+     * @param string $type Type to check.
154
+     *
155
+     * @return string|null
156
+     */
157
+    private function determine_scalar( $type ) {
158
+        $synonyms = array(
159
+            'int' => 'integer',
160
+            'float' => 'double',
161
+            'bool' => 'boolean',
162
+        );
163
+
164
+        if ( array_key_exists( $type, $synonyms ) ) {
165
+            $type = $synonyms[ $type ];
166
+        }
167
+
168
+        return in_array( $type, array( 'string', 'integer', 'double', 'boolean' ) ) ?
169
+            $type :
170
+            null;
171
+    }
172 172
 }
Please login to merge, or discard this patch.
Spacing   +33 added lines, -34 removed lines patch added patch discarded remove patch
@@ -28,8 +28,8 @@  discard block
 block discarded – undo
28 28
 	 * @param string $type
29 29
 	 * @param bool   $key_type
30 30
 	 */
31
-	public function __construct( $type, $key_type = false ) {
32
-		$this->type = $this->determine( $type, $key_type );
31
+	public function __construct($type, $key_type = false) {
32
+		$this->type = $this->determine($type, $key_type);
33 33
 	}
34 34
 
35 35
 	/**
@@ -47,12 +47,12 @@  discard block
 block discarded – undo
47 47
 	 * @return bool
48 48
 	 */
49 49
 	public function is_model() {
50
-		if ( ! class_exists( $this->type ) ) {
50
+		if (!class_exists($this->type)) {
51 51
 			return false;
52 52
 		}
53 53
 
54
-		$reflection = new ReflectionClass( $this->type );
55
-		return $reflection->isSubclassOf( 'Intraxia\Jaxion\Axolotl\Model' );
54
+		$reflection = new ReflectionClass($this->type);
55
+		return $reflection->isSubclassOf('Intraxia\Jaxion\Axolotl\Model');
56 56
 	}
57 57
 
58 58
 	/**
@@ -62,8 +62,8 @@  discard block
 block discarded – undo
62 62
 	 *
63 63
 	 * @return Model
64 64
 	 */
65
-	public function create_model( array $data ) {
66
-		return new $this->type( $data );
65
+	public function create_model(array $data) {
66
+		return new $this->type($data);
67 67
 	}
68 68
 
69 69
 	/**
@@ -73,9 +73,9 @@  discard block
 block discarded – undo
73 73
 	 *
74 74
 	 * @throws InvalidArgumentException
75 75
 	 */
76
-	public function validate_elements( array $elements ) {
77
-		foreach ( $elements as $element ) {
78
-			$this->validate_element( $element );
76
+	public function validate_elements(array $elements) {
77
+		foreach ($elements as $element) {
78
+			$this->validate_element($element);
79 79
 		}
80 80
 	}
81 81
 
@@ -86,25 +86,25 @@  discard block
 block discarded – undo
86 86
 	 *
87 87
 	 * @throws InvalidArgumentException
88 88
 	 */
89
-	public function validate_element( $element ) {
90
-		$type = gettype( $element );
89
+	public function validate_element($element) {
90
+		$type = gettype($element);
91 91
 		$callable = $this->type === 'callable';
92 92
 		$is_object = 'object' === $type;
93 93
 		$loose_check = $this->type === 'object';
94 94
 
95 95
 		// callable must be callable
96
-		if ( $callable && ! is_callable( $element ) ) {
97
-			throw new InvalidArgumentException( 'Item must be callable' );
96
+		if ($callable && !is_callable($element)) {
97
+			throw new InvalidArgumentException('Item must be callable');
98 98
 		}
99 99
 
100 100
 		// target isn't callable, object must be an instance of target
101
-		if ( ! $loose_check && ! $callable && $is_object && ! is_a( $element, $this->type ) ) {
102
-			throw new InvalidArgumentException( "Item is not type or subtype of $this->type" );
101
+		if (!$loose_check && !$callable && $is_object && !is_a($element, $this->type)) {
102
+			throw new InvalidArgumentException("Item is not type or subtype of $this->type");
103 103
 		}
104 104
 
105 105
 		// a non callable, non object type should match the target string
106
-		if ( ! $callable && ! $is_object && $type !== $this->type ) {
107
-			throw new InvalidArgumentException( "Item is not of type: $this->type" );
106
+		if (!$callable && !$is_object && $type !== $this->type) {
107
+			throw new InvalidArgumentException("Item is not of type: $this->type");
108 108
 		}
109 109
 	}
110 110
 
@@ -118,20 +118,20 @@  discard block
 block discarded – undo
118 118
 	 *
119 119
 	 * @throws InvalidArgumentException
120 120
 	 */
121
-	private function determine( $type, $key_type = false ) {
122
-		if ( ! $key_type && $this->non_scalar_type_exists( $type ) ) {
121
+	private function determine($type, $key_type = false) {
122
+		if (!$key_type && $this->non_scalar_type_exists($type)) {
123 123
 			return $type;
124 124
 		}
125 125
 
126
-		if ( $scalar_type = $this->determine_scalar( $type ) ) {
127
-			if ( $key_type && (in_array( $scalar_type, array( 'double', 'boolean' ) )) ) {
128
-				throw new InvalidArgumentException( 'This type is not supported as a key.' );
126
+		if ($scalar_type = $this->determine_scalar($type)) {
127
+			if ($key_type && (in_array($scalar_type, array('double', 'boolean')))) {
128
+				throw new InvalidArgumentException('This type is not supported as a key.');
129 129
 			}
130 130
 
131 131
 			return $scalar_type;
132 132
 		}
133 133
 
134
-		throw new InvalidArgumentException( 'This type does not exist.' );
134
+		throw new InvalidArgumentException('This type does not exist.');
135 135
 	}
136 136
 
137 137
 	/**
@@ -141,10 +141,10 @@  discard block
 block discarded – undo
141 141
 	 *
142 142
 	 * @return bool
143 143
 	 */
144
-	private function non_scalar_type_exists( $type ) {
145
-		return class_exists( $type )
146
-				|| interface_exists( $type )
147
-				|| in_array( $type, array( 'array', 'object', 'callable' ) );
144
+	private function non_scalar_type_exists($type) {
145
+		return class_exists($type)
146
+				|| interface_exists($type)
147
+				|| in_array($type, array('array', 'object', 'callable'));
148 148
 	}
149 149
 
150 150
 	/**
@@ -154,19 +154,18 @@  discard block
 block discarded – undo
154 154
 	 *
155 155
 	 * @return string|null
156 156
 	 */
157
-	private function determine_scalar( $type ) {
157
+	private function determine_scalar($type) {
158 158
 		$synonyms = array(
159 159
 			'int' => 'integer',
160 160
 			'float' => 'double',
161 161
 			'bool' => 'boolean',
162 162
 		);
163 163
 
164
-		if ( array_key_exists( $type, $synonyms ) ) {
165
-			$type = $synonyms[ $type ];
164
+		if (array_key_exists($type, $synonyms)) {
165
+			$type = $synonyms[$type];
166 166
 		}
167 167
 
168
-		return in_array( $type, array( 'string', 'integer', 'double', 'boolean' ) ) ?
169
-			$type :
170
-			null;
168
+		return in_array($type, array('string', 'integer', 'double', 'boolean')) ?
169
+			$type : null;
171 170
 	}
172 171
 }
Please login to merge, or discard this patch.
src/Axolotl/Collection.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -676,7 +676,7 @@  discard block
 block discarded – undo
676 676
 	/**
677 677
 	 * Return the key of the current element.
678 678
 	 *
679
-	 * @return mixed
679
+	 * @return integer
680 680
 	 */
681 681
 	public function key() {
682 682
 		return $this->position;
@@ -703,7 +703,7 @@  discard block
 block discarded – undo
703 703
 	 * from a trusted set of elements.
704 704
 	 *
705 705
 	 * @param array      $elements Array of elements to pass into new collection.
706
-	 * @param null|mixed $type
706
+	 * @param string $type
707 707
 	 *
708 708
 	 * @return static
709 709
 	 */
Please login to merge, or discard this patch.
Indentation   +741 added lines, -741 removed lines patch added patch discarded remove patch
@@ -15,745 +15,745 @@
 block discarded – undo
15 15
  */
16 16
 class Collection implements CollectionContract {
17 17
 
18
-	/**
19
-	 * Collection elements.
20
-	 *
21
-	 * @var array
22
-	 */
23
-	protected $elements = array();
24
-
25
-	/**
26
-	 * Collection type to enforce.
27
-	 *
28
-	 * @var Type
29
-	 */
30
-	private $type;
31
-
32
-	/**
33
-	 * Where Collection is in loop.
34
-	 *
35
-	 * @var int
36
-	 */
37
-	protected $position = 0;
38
-
39
-	/**
40
-	 * Collection constructor.
41
-	 *
42
-	 * @param string $type
43
-	 * @param array  $elements
44
-	 */
45
-	public function __construct( $type, array $elements = array() ) {
46
-		$this->type = new Type( $type );
47
-
48
-		if ( $this->type->is_model() ) {
49
-			foreach ( $elements as $idx => $element ) {
50
-				if ( is_array( $element ) ) {
51
-					$elements[ $idx ] = $this->type->create_model( $element );
52
-				}
53
-			}
54
-		}
55
-
56
-		if ( $elements ) {
57
-			$this->type->validate_elements( $elements );
58
-		}
59
-
60
-		$this->elements = $elements;
61
-	}
62
-
63
-	/**
64
-	 * {@inheritdoc}
65
-	 *
66
-	 * @return string
67
-	 */
68
-	public function get_type() {
69
-		return $this->type->get_type();
70
-	}
71
-
72
-	/**
73
-	 * {@inheritdoc}
74
-	 *
75
-	 * @param mixed $element
76
-	 *
77
-	 * @return Collection
78
-	 *
79
-	 * @throws InvalidArgumentException
80
-	 */
81
-	public function add( $element ) {
82
-		if ( $this->type->is_model() && is_array( $element ) ) {
83
-			$element = $this->type->create_model( $element );
84
-		}
85
-
86
-		$this->type->validate_element( $element );
87
-
88
-		$elements   = $this->elements;
89
-		$elements[] = $element;
90
-
91
-		$collection = new static( $this->get_type() );
92
-		$collection->set_from_trusted( $elements );
93
-
94
-		return $collection;
95
-	}
96
-
97
-	/**
98
-	 * {@inheritdoc}
99
-	 *
100
-	 * @return Collection
101
-	 */
102
-	public function clear() {
103
-		return new static( $this->get_type() );
104
-	}
105
-
106
-	/**
107
-	 * {@inheritdoc}
108
-	 *
109
-	 * @param  callable $condition Condition to satisfy.
110
-	 *
111
-	 * @return bool
112
-	 */
113
-	public function contains( $condition ) {
114
-		return (bool) $this->find( $condition );
115
-	}
116
-
117
-	/**
118
-	 * {@inheritdoc}
119
-	 *
120
-	 * @param  callable $condition Condition to satisfy.
121
-	 *
122
-	 * @return mixed
123
-	 */
124
-	public function find( $condition ) {
125
-		$index = $this->find_index( $condition );
126
-
127
-		return -1 === $index ? null : $this->elements[ $index ];
128
-	}
129
-
130
-	/**
131
-	 * {@inheritdoc}
132
-	 *
133
-	 * @param  callable $condition Condition to satisfy.
134
-	 *
135
-	 * @return int
136
-	 */
137
-	public function find_index( $condition ) {
138
-		$index = -1;
139
-
140
-		for ( $i = 0, $count = count( $this->elements ); $i < $count; $i++ ) {
141
-			if ( call_user_func( $condition, ($this->at( $i ) ) ) ) {
142
-				$index = $i;
143
-				break;
144
-			}
145
-		}
146
-
147
-		return $index;
148
-	}
149
-
150
-	/**
151
-	 * Fetches the element at the provided index.
152
-	 *
153
-	 * @param int $index Index to get element from.
154
-	 *
155
-	 * @return mixed
156
-	 *
157
-	 * @throws OutOfRangeException
158
-	 */
159
-	public function at( $index ) {
160
-		$this->validate_index( $index );
161
-
162
-		return $this->elements[ $index ];
163
-	}
164
-
165
-	/**
166
-	 * {@inheritdoc}
167
-	 *
168
-	 * @param  int $index Index to check for existence.
169
-	 *
170
-	 * @return bool
171
-	 *
172
-	 * @throws InvalidArgumentException
173
-	 */
174
-	public function index_exists( $index ) {
175
-		if ( ! is_int( $index ) ) {
176
-			throw new InvalidArgumentException( 'Index must be an integer' );
177
-		}
178
-
179
-		if ( $index < 0 ) {
180
-			throw new InvalidArgumentException( 'Index must be a non-negative integer' );
181
-		}
182
-
183
-		return $index < $this->count();
184
-	}
185
-
186
-	/**
187
-	 * {@inheritdoc}
188
-	 *
189
-	 * @param  callable $condition Condition to satisfy.
190
-	 *
191
-	 * @return Collection
192
-	 */
193
-	public function filter( $condition ) {
194
-		$elements = array();
195
-
196
-		foreach ( $this->elements as $element ) {
197
-			if ( call_user_func( $condition, $element ) ) {
198
-				$elements[] = $element;
199
-			}
200
-		}
201
-
202
-		return $this->new_from_trusted( $elements );
203
-	}
204
-	/**
205
-	 * {@inheritdoc}
206
-	 *
207
-	 * @param  callable $condition Condition to satisfy.
208
-	 *
209
-	 * @return mixed
210
-	 */
211
-	public function find_last( $condition ) {
212
-		$index = $this->find_last_index( $condition );
213
-
214
-		return -1 === $index ? null : $this->elements[ $index ];
215
-	}
216
-
217
-	/**
218
-	 * {@inheritdoc}
219
-	 *
220
-	 * @param  callable $condition
221
-	 * @return int
222
-	 */
223
-	public function find_last_index( $condition ) {
224
-		$index = -1;
225
-
226
-		for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
227
-			if ( call_user_func( $condition, $this->elements[ $i ] ) ) {
228
-				$index = $i;
229
-				break;
230
-			}
231
-		}
232
-
233
-		return $index;
234
-	}
235
-
236
-	/**
237
-	 * {@inheritdoc}
238
-	 *
239
-	 * @param  int $start Begining index to slice from.
240
-	 * @param  int $end   End index to slice to.
241
-	 *
242
-	 * @return Collection
243
-	 *
244
-	 * @throws InvalidArgumentException
245
-	 */
246
-	public function slice( $start, $end ) {
247
-		if ( $start < 0 || ! is_int( $start ) ) {
248
-			throw new InvalidArgumentException( 'Start must be a non-negative integer' );
249
-		}
250
-
251
-		if ( $end < 0 || ! is_int( $end ) ) {
252
-			throw new InvalidArgumentException( 'End must be a positive integer' );
253
-		}
254
-
255
-		if ( $start > $end ) {
256
-			throw new InvalidArgumentException( 'End must be greater than start' );
257
-		}
258
-
259
-		if ( $end > $this->count() + 1 ) {
260
-			throw new InvalidArgumentException( 'End must be less than the count of the items in the Collection' );
261
-		}
262
-
263
-		$length = $end - $start + 1;
264
-
265
-		return $this->new_from_trusted( array_slice( $this->elements, $start, $length ) );
266
-	}
267
-
268
-	/**
269
-	 * {@inheritdoc}
270
-	 *
271
-	 * @param int   $index     Index to start at.
272
-	 * @param mixed $element Element to insert.
273
-	 *
274
-	 * @return Collection
275
-	 *
276
-	 * @throws InvalidArgumentException
277
-	 * @throws OutOfRangeException
278
-	 */
279
-	public function insert( $index, $element ) {
280
-		$this->validate_index( $index );
281
-		$this->type->validate_element( $element );
282
-
283
-		$a = array_slice( $this->elements, 0, $index );
284
-		$b = array_slice( $this->elements, $index, count( $this->elements ) );
285
-
286
-		$a[] = $element;
287
-
288
-		return $this->new_from_trusted( array_merge( $a, $b ) );
289
-	}
290
-
291
-	/**
292
-	 * {@inheritdoc}
293
-	 *
294
-	 * @param int   $index    Index to start insertion at.
295
-	 * @param array $elements Elements in insert.
296
-	 *
297
-	 * @return Collection
298
-	 *
299
-	 * @throws OutOfRangeException
300
-	 */
301
-	public function insert_range( $index, array $elements ) {
302
-		$this->validate_index( $index );
303
-		$this->type->validate_elements( $elements );
304
-
305
-		if ( $index < 0 ) {
306
-			$index = $this->count() + $index + 1;
307
-		}
308
-
309
-		return $this->new_from_trusted(
310
-			array_merge(
311
-				array_slice( $this->elements, 0, $index ),
312
-				$elements,
313
-				array_slice( $this->elements, $index, count( $this->elements ) )
314
-			)
315
-		);
316
-	}
317
-
318
-	/**
319
-	 * {@inheritdoc}
320
-	 *
321
-	 * @param  callable $condition Condition to satisfy.
322
-	 *
323
-	 * @return Collection
324
-	 */
325
-	public function reject( $condition ) {
326
-		$inverse = function ( $element ) use ( $condition ) {
327
-			return ! call_user_func( $condition, $element );
328
-		};
329
-
330
-		return $this->filter( $inverse );
331
-	}
332
-
333
-	/**
334
-	 * {@inheritdoc}
335
-	 *
336
-	 * @param  int $index Index to remove.
337
-	 *
338
-	 * @return Collection
339
-	 *
340
-	 * @throws OutOfRangeException
341
-	 */
342
-	public function remove_at( $index ) {
343
-		$this->validate_index( $index );
344
-
345
-		$elements = $this->elements;
346
-
347
-		return $this->new_from_trusted(
348
-			array_merge(
349
-				array_slice( $elements, 0, $index ),
350
-				array_slice( $elements, $index + 1, count( $elements ) )
351
-			)
352
-		);
353
-	}
354
-	/**
355
-	 * {@inheritdoc}
356
-	 *
357
-	 * @return Collection
358
-	 */
359
-	public function reverse() {
360
-		return $this->new_from_trusted(
361
-			array_reverse( $this->elements )
362
-		);
363
-	}
364
-
365
-	/**
366
-	 * {@inheritdoc}
367
-	 *
368
-	 * @param callable $callback Sort callback.
369
-	 *
370
-	 * @return Collection
371
-	 */
372
-	public function sort( $callback ) {
373
-		$elements = $this->elements;
374
-		usort( $elements, $callback );
375
-		return $this->new_from_trusted( $elements );
376
-	}
377
-
378
-	/**
379
-	 * {@inheritdoc}
380
-	 *
381
-	 * @return array
382
-	 */
383
-	public function to_array() {
384
-		return $this->elements;
385
-	}
386
-
387
-	/**
388
-	 * {@inheritdoc}
389
-	 *
390
-	 * @param callable $callable Reducer function.
391
-	 *
392
-	 * @param null     $initial  Initial reducer value.
393
-	 *
394
-	 * @return mixed
395
-	 */
396
-	public function reduce( $callable, $initial = null ) {
397
-		return array_reduce( $this->elements, $callable, $initial );
398
-	}
399
-
400
-	/**
401
-	 * {@inheritdoc}
402
-	 *
403
-	 * @param callable $condition Condition callback.
404
-	 *
405
-	 * @return bool
406
-	 */
407
-	public function every( $condition ) {
408
-		$response = true;
409
-
410
-		foreach ( $this->elements as $element ) {
411
-			$result = call_user_func( $condition, $element );
412
-
413
-			if ( false === $result ) {
414
-				$response = false;
415
-				break;
416
-			}
417
-		}
418
-
419
-		return $response;
420
-	}
421
-
422
-	/**
423
-	 * {@inheritdoc}
424
-	 *
425
-	 * @param  int $num Number of elements to drop.
426
-	 *
427
-	 * @return Collection
428
-	 *
429
-	 * @throws InvalidArgumentException
430
-	 */
431
-	public function drop( $num ) {
432
-		if ( $num > $this->count() ) {
433
-			$num = $this->count();
434
-		}
435
-
436
-		return $this->slice( $num, $this->count() );
437
-	}
438
-
439
-	/**
440
-	 * {@inheritdoc}
441
-	 *
442
-	 * @param int $num Number of elements to drop.
443
-	 *
444
-	 * @return Collection
445
-	 *
446
-	 * @throws InvalidArgumentException
447
-	 */
448
-	public function drop_right( $num ) {
449
-		return $num !== $this->count()
450
-			? $this->slice( 0, $this->count() - $num - 1 )
451
-			: $this->clear();
452
-	}
453
-
454
-	/**
455
-	 * {@inheritdoc}
456
-	 *
457
-	 * @param callable $condition Condition callback.
458
-	 *
459
-	 * @return Collection
460
-	 */
461
-	public function drop_while( $condition ) {
462
-		$count = $this->count_while_true( $condition );
463
-		return $count ? $this->drop( $count ) : $this;
464
-	}
465
-	/**
466
-	 * {@inheritdoc}
467
-	 *
468
-	 * @return Collection
469
-	 *
470
-	 * @throws InvalidArgumentException
471
-	 */
472
-	public function tail() {
473
-		return $this->slice( 1, $this->count() );
474
-	}
475
-
476
-	/**
477
-	 * {@inheritdoc}
478
-	 *
479
-	 * @param  int $num Number of elements to take.
480
-	 *
481
-	 * @return Collection
482
-	 *
483
-	 * @throws InvalidArgumentException
484
-	 */
485
-	public function take( $num ) {
486
-		return $this->slice( 0, $num - 1 );
487
-	}
488
-
489
-	/**
490
-	 * {@inheritdoc}
491
-	 *
492
-	 * @param int $num Number of elements to take.
493
-	 *
494
-	 * @return Collection
495
-	 *
496
-	 * @throws InvalidArgumentException
497
-	 */
498
-	public function take_right( $num ) {
499
-		return $this->slice( $this->count() - $num, $this->count() );
500
-	}
501
-
502
-	/**
503
-	 * {@inheritdoc}
504
-	 *
505
-	 * @param callable $condition Callback function.
506
-	 *
507
-	 * @return Collection
508
-	 */
509
-	public function take_while( $condition ) {
510
-		$count = $this->count_while_true( $condition );
511
-
512
-		return $count ? $this->take( $count ) : $this->clear();
513
-	}
514
-
515
-	/**
516
-	 * {@inheritdoc}
517
-	 *
518
-	 * @param callable $callable Callback function.
519
-	 */
520
-	public function each( $callable ) {
521
-		foreach ( $this->elements as $element ) {
522
-			call_user_func( $callable, $element );
523
-		}
524
-	}
525
-
526
-	/**
527
-	 * {@inheritdoc}
528
-	 *
529
-	 * @param callable $callable Callback function.
530
-	 *
531
-	 * @return Collection
532
-	 */
533
-	public function map( $callable ) {
534
-		$elements = array();
535
-		$type = null;
536
-		foreach ( $this->elements as $element ) {
537
-			$result = call_user_func( $callable, $element );
538
-
539
-			if ( null === $type ) {
540
-				$type = gettype( $result );
541
-
542
-				if ( 'object' === $type ) {
543
-					$type = get_class( $result );
544
-				}
545
-			}
546
-
547
-			$elements[] = $result;
548
-		}
549
-
550
-		return $this->new_from_trusted( $elements, $type ? : $this->get_type() );
551
-	}
552
-
553
-	/**
554
-	 * {@inheritdoc}
555
-	 *
556
-	 * @param callable $callable Reducer function.
557
-	 * @param null     $initial  Initial value.
558
-	 *
559
-	 * @return mixed
560
-	 */
561
-	public function reduce_right( $callable, $initial = null ) {
562
-		return array_reduce(
563
-			array_reverse( $this->elements ),
564
-			$callable,
565
-			$initial
566
-		);
567
-	}
568
-
569
-	/**
570
-	 * {@inheritdoc}
571
-	 *
572
-	 * @return Collection
573
-	 */
574
-	public function shuffle() {
575
-		$elements = $this->elements;
576
-		shuffle( $elements );
577
-
578
-		return $this->new_from_trusted( $elements );
579
-	}
580
-
581
-	/**
582
-	 * {@inheritdoc}
583
-	 *
584
-	 * @param array|Collection $elements Array of elements to merge.
585
-	 *
586
-	 * @return Collection
587
-	 *
588
-	 * @throws InvalidArgumentException
589
-	 */
590
-	public function merge( $elements ) {
591
-		if ( $elements instanceof static ) {
592
-			$elements = $elements->to_array();
593
-		}
594
-
595
-		if ( ! is_array( $elements ) ) {
596
-			throw new InvalidArgumentException( 'Merge must be given array or Collection' );
597
-		}
598
-
599
-		$this->type->validate_elements( $elements );
600
-
601
-		return $this->new_from_trusted(
602
-			array_merge( $this->elements, $elements )
603
-		);
604
-	}
605
-
606
-	/**
607
-	 * {@inheritdoc}
608
-	 *
609
-	 * @return mixed
610
-	 *
611
-	 * @throws OutOfBoundsException
612
-	 */
613
-	public function first() {
614
-		if ( empty( $this->elements ) ) {
615
-			throw new OutOfBoundsException( 'Cannot get first element of empty Collection' );
616
-		}
617
-
618
-		return reset( $this->elements );
619
-	}
620
-
621
-	/**
622
-	 * {@inheritdoc}
623
-	 *
624
-	 * @return mixed
625
-	 *
626
-	 * @throws OutOfBoundsException
627
-	 */
628
-	public function last() {
629
-		if ( empty( $this->elements ) ) {
630
-			throw new OutOfBoundsException( 'Cannot get last element of empty Collection' );
631
-		}
632
-
633
-		return end( $this->elements );
634
-	}
635
-
636
-	/**
637
-	 * {@inheritdoc}
638
-	 *
639
-	 * @return int
640
-	 */
641
-	public function count() {
642
-		return count( $this->elements );
643
-	}
644
-
645
-	/**
646
-	 * {@inheritDoc}
647
-	 *
648
-	 * @return array
649
-	 */
650
-	public function serialize() {
651
-		return $this->map(function( $element ) {
652
-			if ( $element instanceof Serializes ) {
653
-				return $element->serialize();
654
-			}
655
-
656
-			return $element;
657
-		} )->to_array();
658
-	}
659
-
660
-	/**
661
-	 * Return the current element.
662
-	 *
663
-	 * @return mixed
664
-	 */
665
-	public function current() {
666
-		return $this->at( $this->position );
667
-	}
668
-
669
-	/**
670
-	 * Move forward to next element.
671
-	 */
672
-	public function next() {
673
-		$this->position ++;
674
-	}
675
-
676
-	/**
677
-	 * Return the key of the current element.
678
-	 *
679
-	 * @return mixed
680
-	 */
681
-	public function key() {
682
-		return $this->position;
683
-	}
684
-
685
-	/**
686
-	 * Checks if current position is valid.
687
-	 *
688
-	 * @return bool
689
-	 */
690
-	public function valid() {
691
-		return isset( $this->elements[ $this->position ] );
692
-	}
693
-
694
-	/**
695
-	 * Rewind the Iterator to the first element.
696
-	 */
697
-	public function rewind() {
698
-		$this->position = 0;
699
-	}
700
-
701
-	/**
702
-	 * Creates a new instance of the Collection
703
-	 * from a trusted set of elements.
704
-	 *
705
-	 * @param array      $elements Array of elements to pass into new collection.
706
-	 * @param null|mixed $type
707
-	 *
708
-	 * @return static
709
-	 */
710
-	protected function new_from_trusted( array $elements, $type = null ) {
711
-		$collection = new static( null !== $type ? $type : $this->get_type() );
712
-		$collection->set_from_trusted( $elements );
713
-
714
-		return $collection;
715
-	}
716
-
717
-	/**
718
-	 * Sets the elements without validating them.
719
-	 *
720
-	 * @param array $elements Pre-validated elements to set.
721
-	 */
722
-	protected function set_from_trusted( array $elements ) {
723
-		$this->elements = $elements;
724
-	}
725
-
726
-	/**
727
-	 * Number of elements true for the condition.
728
-	 *
729
-	 * @param callable $condition Condition to check.
730
-	 * @return int
731
-	 */
732
-	protected function count_while_true( $condition ) {
733
-		$count = 0;
734
-
735
-		foreach ( $this->elements as $element ) {
736
-			if ( ! $condition($element) ) {
737
-				break;
738
-			}
739
-			$count++;
740
-		}
741
-
742
-		return $count;
743
-	}
744
-
745
-	/**
746
-	 * Validates a number to be used as an index.
747
-	 *
748
-	 * @param  integer $index The number to be validated as an index.
749
-	 *
750
-	 * @throws OutOfRangeException
751
-	 */
752
-	protected function validate_index( $index ) {
753
-		$exists = $this->index_exists( $index );
754
-
755
-		if ( ! $exists ) {
756
-			throw new OutOfRangeException( 'Index out of bounds of collection' );
757
-		}
758
-	}
18
+    /**
19
+     * Collection elements.
20
+     *
21
+     * @var array
22
+     */
23
+    protected $elements = array();
24
+
25
+    /**
26
+     * Collection type to enforce.
27
+     *
28
+     * @var Type
29
+     */
30
+    private $type;
31
+
32
+    /**
33
+     * Where Collection is in loop.
34
+     *
35
+     * @var int
36
+     */
37
+    protected $position = 0;
38
+
39
+    /**
40
+     * Collection constructor.
41
+     *
42
+     * @param string $type
43
+     * @param array  $elements
44
+     */
45
+    public function __construct( $type, array $elements = array() ) {
46
+        $this->type = new Type( $type );
47
+
48
+        if ( $this->type->is_model() ) {
49
+            foreach ( $elements as $idx => $element ) {
50
+                if ( is_array( $element ) ) {
51
+                    $elements[ $idx ] = $this->type->create_model( $element );
52
+                }
53
+            }
54
+        }
55
+
56
+        if ( $elements ) {
57
+            $this->type->validate_elements( $elements );
58
+        }
59
+
60
+        $this->elements = $elements;
61
+    }
62
+
63
+    /**
64
+     * {@inheritdoc}
65
+     *
66
+     * @return string
67
+     */
68
+    public function get_type() {
69
+        return $this->type->get_type();
70
+    }
71
+
72
+    /**
73
+     * {@inheritdoc}
74
+     *
75
+     * @param mixed $element
76
+     *
77
+     * @return Collection
78
+     *
79
+     * @throws InvalidArgumentException
80
+     */
81
+    public function add( $element ) {
82
+        if ( $this->type->is_model() && is_array( $element ) ) {
83
+            $element = $this->type->create_model( $element );
84
+        }
85
+
86
+        $this->type->validate_element( $element );
87
+
88
+        $elements   = $this->elements;
89
+        $elements[] = $element;
90
+
91
+        $collection = new static( $this->get_type() );
92
+        $collection->set_from_trusted( $elements );
93
+
94
+        return $collection;
95
+    }
96
+
97
+    /**
98
+     * {@inheritdoc}
99
+     *
100
+     * @return Collection
101
+     */
102
+    public function clear() {
103
+        return new static( $this->get_type() );
104
+    }
105
+
106
+    /**
107
+     * {@inheritdoc}
108
+     *
109
+     * @param  callable $condition Condition to satisfy.
110
+     *
111
+     * @return bool
112
+     */
113
+    public function contains( $condition ) {
114
+        return (bool) $this->find( $condition );
115
+    }
116
+
117
+    /**
118
+     * {@inheritdoc}
119
+     *
120
+     * @param  callable $condition Condition to satisfy.
121
+     *
122
+     * @return mixed
123
+     */
124
+    public function find( $condition ) {
125
+        $index = $this->find_index( $condition );
126
+
127
+        return -1 === $index ? null : $this->elements[ $index ];
128
+    }
129
+
130
+    /**
131
+     * {@inheritdoc}
132
+     *
133
+     * @param  callable $condition Condition to satisfy.
134
+     *
135
+     * @return int
136
+     */
137
+    public function find_index( $condition ) {
138
+        $index = -1;
139
+
140
+        for ( $i = 0, $count = count( $this->elements ); $i < $count; $i++ ) {
141
+            if ( call_user_func( $condition, ($this->at( $i ) ) ) ) {
142
+                $index = $i;
143
+                break;
144
+            }
145
+        }
146
+
147
+        return $index;
148
+    }
149
+
150
+    /**
151
+     * Fetches the element at the provided index.
152
+     *
153
+     * @param int $index Index to get element from.
154
+     *
155
+     * @return mixed
156
+     *
157
+     * @throws OutOfRangeException
158
+     */
159
+    public function at( $index ) {
160
+        $this->validate_index( $index );
161
+
162
+        return $this->elements[ $index ];
163
+    }
164
+
165
+    /**
166
+     * {@inheritdoc}
167
+     *
168
+     * @param  int $index Index to check for existence.
169
+     *
170
+     * @return bool
171
+     *
172
+     * @throws InvalidArgumentException
173
+     */
174
+    public function index_exists( $index ) {
175
+        if ( ! is_int( $index ) ) {
176
+            throw new InvalidArgumentException( 'Index must be an integer' );
177
+        }
178
+
179
+        if ( $index < 0 ) {
180
+            throw new InvalidArgumentException( 'Index must be a non-negative integer' );
181
+        }
182
+
183
+        return $index < $this->count();
184
+    }
185
+
186
+    /**
187
+     * {@inheritdoc}
188
+     *
189
+     * @param  callable $condition Condition to satisfy.
190
+     *
191
+     * @return Collection
192
+     */
193
+    public function filter( $condition ) {
194
+        $elements = array();
195
+
196
+        foreach ( $this->elements as $element ) {
197
+            if ( call_user_func( $condition, $element ) ) {
198
+                $elements[] = $element;
199
+            }
200
+        }
201
+
202
+        return $this->new_from_trusted( $elements );
203
+    }
204
+    /**
205
+     * {@inheritdoc}
206
+     *
207
+     * @param  callable $condition Condition to satisfy.
208
+     *
209
+     * @return mixed
210
+     */
211
+    public function find_last( $condition ) {
212
+        $index = $this->find_last_index( $condition );
213
+
214
+        return -1 === $index ? null : $this->elements[ $index ];
215
+    }
216
+
217
+    /**
218
+     * {@inheritdoc}
219
+     *
220
+     * @param  callable $condition
221
+     * @return int
222
+     */
223
+    public function find_last_index( $condition ) {
224
+        $index = -1;
225
+
226
+        for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
227
+            if ( call_user_func( $condition, $this->elements[ $i ] ) ) {
228
+                $index = $i;
229
+                break;
230
+            }
231
+        }
232
+
233
+        return $index;
234
+    }
235
+
236
+    /**
237
+     * {@inheritdoc}
238
+     *
239
+     * @param  int $start Begining index to slice from.
240
+     * @param  int $end   End index to slice to.
241
+     *
242
+     * @return Collection
243
+     *
244
+     * @throws InvalidArgumentException
245
+     */
246
+    public function slice( $start, $end ) {
247
+        if ( $start < 0 || ! is_int( $start ) ) {
248
+            throw new InvalidArgumentException( 'Start must be a non-negative integer' );
249
+        }
250
+
251
+        if ( $end < 0 || ! is_int( $end ) ) {
252
+            throw new InvalidArgumentException( 'End must be a positive integer' );
253
+        }
254
+
255
+        if ( $start > $end ) {
256
+            throw new InvalidArgumentException( 'End must be greater than start' );
257
+        }
258
+
259
+        if ( $end > $this->count() + 1 ) {
260
+            throw new InvalidArgumentException( 'End must be less than the count of the items in the Collection' );
261
+        }
262
+
263
+        $length = $end - $start + 1;
264
+
265
+        return $this->new_from_trusted( array_slice( $this->elements, $start, $length ) );
266
+    }
267
+
268
+    /**
269
+     * {@inheritdoc}
270
+     *
271
+     * @param int   $index     Index to start at.
272
+     * @param mixed $element Element to insert.
273
+     *
274
+     * @return Collection
275
+     *
276
+     * @throws InvalidArgumentException
277
+     * @throws OutOfRangeException
278
+     */
279
+    public function insert( $index, $element ) {
280
+        $this->validate_index( $index );
281
+        $this->type->validate_element( $element );
282
+
283
+        $a = array_slice( $this->elements, 0, $index );
284
+        $b = array_slice( $this->elements, $index, count( $this->elements ) );
285
+
286
+        $a[] = $element;
287
+
288
+        return $this->new_from_trusted( array_merge( $a, $b ) );
289
+    }
290
+
291
+    /**
292
+     * {@inheritdoc}
293
+     *
294
+     * @param int   $index    Index to start insertion at.
295
+     * @param array $elements Elements in insert.
296
+     *
297
+     * @return Collection
298
+     *
299
+     * @throws OutOfRangeException
300
+     */
301
+    public function insert_range( $index, array $elements ) {
302
+        $this->validate_index( $index );
303
+        $this->type->validate_elements( $elements );
304
+
305
+        if ( $index < 0 ) {
306
+            $index = $this->count() + $index + 1;
307
+        }
308
+
309
+        return $this->new_from_trusted(
310
+            array_merge(
311
+                array_slice( $this->elements, 0, $index ),
312
+                $elements,
313
+                array_slice( $this->elements, $index, count( $this->elements ) )
314
+            )
315
+        );
316
+    }
317
+
318
+    /**
319
+     * {@inheritdoc}
320
+     *
321
+     * @param  callable $condition Condition to satisfy.
322
+     *
323
+     * @return Collection
324
+     */
325
+    public function reject( $condition ) {
326
+        $inverse = function ( $element ) use ( $condition ) {
327
+            return ! call_user_func( $condition, $element );
328
+        };
329
+
330
+        return $this->filter( $inverse );
331
+    }
332
+
333
+    /**
334
+     * {@inheritdoc}
335
+     *
336
+     * @param  int $index Index to remove.
337
+     *
338
+     * @return Collection
339
+     *
340
+     * @throws OutOfRangeException
341
+     */
342
+    public function remove_at( $index ) {
343
+        $this->validate_index( $index );
344
+
345
+        $elements = $this->elements;
346
+
347
+        return $this->new_from_trusted(
348
+            array_merge(
349
+                array_slice( $elements, 0, $index ),
350
+                array_slice( $elements, $index + 1, count( $elements ) )
351
+            )
352
+        );
353
+    }
354
+    /**
355
+     * {@inheritdoc}
356
+     *
357
+     * @return Collection
358
+     */
359
+    public function reverse() {
360
+        return $this->new_from_trusted(
361
+            array_reverse( $this->elements )
362
+        );
363
+    }
364
+
365
+    /**
366
+     * {@inheritdoc}
367
+     *
368
+     * @param callable $callback Sort callback.
369
+     *
370
+     * @return Collection
371
+     */
372
+    public function sort( $callback ) {
373
+        $elements = $this->elements;
374
+        usort( $elements, $callback );
375
+        return $this->new_from_trusted( $elements );
376
+    }
377
+
378
+    /**
379
+     * {@inheritdoc}
380
+     *
381
+     * @return array
382
+     */
383
+    public function to_array() {
384
+        return $this->elements;
385
+    }
386
+
387
+    /**
388
+     * {@inheritdoc}
389
+     *
390
+     * @param callable $callable Reducer function.
391
+     *
392
+     * @param null     $initial  Initial reducer value.
393
+     *
394
+     * @return mixed
395
+     */
396
+    public function reduce( $callable, $initial = null ) {
397
+        return array_reduce( $this->elements, $callable, $initial );
398
+    }
399
+
400
+    /**
401
+     * {@inheritdoc}
402
+     *
403
+     * @param callable $condition Condition callback.
404
+     *
405
+     * @return bool
406
+     */
407
+    public function every( $condition ) {
408
+        $response = true;
409
+
410
+        foreach ( $this->elements as $element ) {
411
+            $result = call_user_func( $condition, $element );
412
+
413
+            if ( false === $result ) {
414
+                $response = false;
415
+                break;
416
+            }
417
+        }
418
+
419
+        return $response;
420
+    }
421
+
422
+    /**
423
+     * {@inheritdoc}
424
+     *
425
+     * @param  int $num Number of elements to drop.
426
+     *
427
+     * @return Collection
428
+     *
429
+     * @throws InvalidArgumentException
430
+     */
431
+    public function drop( $num ) {
432
+        if ( $num > $this->count() ) {
433
+            $num = $this->count();
434
+        }
435
+
436
+        return $this->slice( $num, $this->count() );
437
+    }
438
+
439
+    /**
440
+     * {@inheritdoc}
441
+     *
442
+     * @param int $num Number of elements to drop.
443
+     *
444
+     * @return Collection
445
+     *
446
+     * @throws InvalidArgumentException
447
+     */
448
+    public function drop_right( $num ) {
449
+        return $num !== $this->count()
450
+            ? $this->slice( 0, $this->count() - $num - 1 )
451
+            : $this->clear();
452
+    }
453
+
454
+    /**
455
+     * {@inheritdoc}
456
+     *
457
+     * @param callable $condition Condition callback.
458
+     *
459
+     * @return Collection
460
+     */
461
+    public function drop_while( $condition ) {
462
+        $count = $this->count_while_true( $condition );
463
+        return $count ? $this->drop( $count ) : $this;
464
+    }
465
+    /**
466
+     * {@inheritdoc}
467
+     *
468
+     * @return Collection
469
+     *
470
+     * @throws InvalidArgumentException
471
+     */
472
+    public function tail() {
473
+        return $this->slice( 1, $this->count() );
474
+    }
475
+
476
+    /**
477
+     * {@inheritdoc}
478
+     *
479
+     * @param  int $num Number of elements to take.
480
+     *
481
+     * @return Collection
482
+     *
483
+     * @throws InvalidArgumentException
484
+     */
485
+    public function take( $num ) {
486
+        return $this->slice( 0, $num - 1 );
487
+    }
488
+
489
+    /**
490
+     * {@inheritdoc}
491
+     *
492
+     * @param int $num Number of elements to take.
493
+     *
494
+     * @return Collection
495
+     *
496
+     * @throws InvalidArgumentException
497
+     */
498
+    public function take_right( $num ) {
499
+        return $this->slice( $this->count() - $num, $this->count() );
500
+    }
501
+
502
+    /**
503
+     * {@inheritdoc}
504
+     *
505
+     * @param callable $condition Callback function.
506
+     *
507
+     * @return Collection
508
+     */
509
+    public function take_while( $condition ) {
510
+        $count = $this->count_while_true( $condition );
511
+
512
+        return $count ? $this->take( $count ) : $this->clear();
513
+    }
514
+
515
+    /**
516
+     * {@inheritdoc}
517
+     *
518
+     * @param callable $callable Callback function.
519
+     */
520
+    public function each( $callable ) {
521
+        foreach ( $this->elements as $element ) {
522
+            call_user_func( $callable, $element );
523
+        }
524
+    }
525
+
526
+    /**
527
+     * {@inheritdoc}
528
+     *
529
+     * @param callable $callable Callback function.
530
+     *
531
+     * @return Collection
532
+     */
533
+    public function map( $callable ) {
534
+        $elements = array();
535
+        $type = null;
536
+        foreach ( $this->elements as $element ) {
537
+            $result = call_user_func( $callable, $element );
538
+
539
+            if ( null === $type ) {
540
+                $type = gettype( $result );
541
+
542
+                if ( 'object' === $type ) {
543
+                    $type = get_class( $result );
544
+                }
545
+            }
546
+
547
+            $elements[] = $result;
548
+        }
549
+
550
+        return $this->new_from_trusted( $elements, $type ? : $this->get_type() );
551
+    }
552
+
553
+    /**
554
+     * {@inheritdoc}
555
+     *
556
+     * @param callable $callable Reducer function.
557
+     * @param null     $initial  Initial value.
558
+     *
559
+     * @return mixed
560
+     */
561
+    public function reduce_right( $callable, $initial = null ) {
562
+        return array_reduce(
563
+            array_reverse( $this->elements ),
564
+            $callable,
565
+            $initial
566
+        );
567
+    }
568
+
569
+    /**
570
+     * {@inheritdoc}
571
+     *
572
+     * @return Collection
573
+     */
574
+    public function shuffle() {
575
+        $elements = $this->elements;
576
+        shuffle( $elements );
577
+
578
+        return $this->new_from_trusted( $elements );
579
+    }
580
+
581
+    /**
582
+     * {@inheritdoc}
583
+     *
584
+     * @param array|Collection $elements Array of elements to merge.
585
+     *
586
+     * @return Collection
587
+     *
588
+     * @throws InvalidArgumentException
589
+     */
590
+    public function merge( $elements ) {
591
+        if ( $elements instanceof static ) {
592
+            $elements = $elements->to_array();
593
+        }
594
+
595
+        if ( ! is_array( $elements ) ) {
596
+            throw new InvalidArgumentException( 'Merge must be given array or Collection' );
597
+        }
598
+
599
+        $this->type->validate_elements( $elements );
600
+
601
+        return $this->new_from_trusted(
602
+            array_merge( $this->elements, $elements )
603
+        );
604
+    }
605
+
606
+    /**
607
+     * {@inheritdoc}
608
+     *
609
+     * @return mixed
610
+     *
611
+     * @throws OutOfBoundsException
612
+     */
613
+    public function first() {
614
+        if ( empty( $this->elements ) ) {
615
+            throw new OutOfBoundsException( 'Cannot get first element of empty Collection' );
616
+        }
617
+
618
+        return reset( $this->elements );
619
+    }
620
+
621
+    /**
622
+     * {@inheritdoc}
623
+     *
624
+     * @return mixed
625
+     *
626
+     * @throws OutOfBoundsException
627
+     */
628
+    public function last() {
629
+        if ( empty( $this->elements ) ) {
630
+            throw new OutOfBoundsException( 'Cannot get last element of empty Collection' );
631
+        }
632
+
633
+        return end( $this->elements );
634
+    }
635
+
636
+    /**
637
+     * {@inheritdoc}
638
+     *
639
+     * @return int
640
+     */
641
+    public function count() {
642
+        return count( $this->elements );
643
+    }
644
+
645
+    /**
646
+     * {@inheritDoc}
647
+     *
648
+     * @return array
649
+     */
650
+    public function serialize() {
651
+        return $this->map(function( $element ) {
652
+            if ( $element instanceof Serializes ) {
653
+                return $element->serialize();
654
+            }
655
+
656
+            return $element;
657
+        } )->to_array();
658
+    }
659
+
660
+    /**
661
+     * Return the current element.
662
+     *
663
+     * @return mixed
664
+     */
665
+    public function current() {
666
+        return $this->at( $this->position );
667
+    }
668
+
669
+    /**
670
+     * Move forward to next element.
671
+     */
672
+    public function next() {
673
+        $this->position ++;
674
+    }
675
+
676
+    /**
677
+     * Return the key of the current element.
678
+     *
679
+     * @return mixed
680
+     */
681
+    public function key() {
682
+        return $this->position;
683
+    }
684
+
685
+    /**
686
+     * Checks if current position is valid.
687
+     *
688
+     * @return bool
689
+     */
690
+    public function valid() {
691
+        return isset( $this->elements[ $this->position ] );
692
+    }
693
+
694
+    /**
695
+     * Rewind the Iterator to the first element.
696
+     */
697
+    public function rewind() {
698
+        $this->position = 0;
699
+    }
700
+
701
+    /**
702
+     * Creates a new instance of the Collection
703
+     * from a trusted set of elements.
704
+     *
705
+     * @param array      $elements Array of elements to pass into new collection.
706
+     * @param null|mixed $type
707
+     *
708
+     * @return static
709
+     */
710
+    protected function new_from_trusted( array $elements, $type = null ) {
711
+        $collection = new static( null !== $type ? $type : $this->get_type() );
712
+        $collection->set_from_trusted( $elements );
713
+
714
+        return $collection;
715
+    }
716
+
717
+    /**
718
+     * Sets the elements without validating them.
719
+     *
720
+     * @param array $elements Pre-validated elements to set.
721
+     */
722
+    protected function set_from_trusted( array $elements ) {
723
+        $this->elements = $elements;
724
+    }
725
+
726
+    /**
727
+     * Number of elements true for the condition.
728
+     *
729
+     * @param callable $condition Condition to check.
730
+     * @return int
731
+     */
732
+    protected function count_while_true( $condition ) {
733
+        $count = 0;
734
+
735
+        foreach ( $this->elements as $element ) {
736
+            if ( ! $condition($element) ) {
737
+                break;
738
+            }
739
+            $count++;
740
+        }
741
+
742
+        return $count;
743
+    }
744
+
745
+    /**
746
+     * Validates a number to be used as an index.
747
+     *
748
+     * @param  integer $index The number to be validated as an index.
749
+     *
750
+     * @throws OutOfRangeException
751
+     */
752
+    protected function validate_index( $index ) {
753
+        $exists = $this->index_exists( $index );
754
+
755
+        if ( ! $exists ) {
756
+            throw new OutOfRangeException( 'Index out of bounds of collection' );
757
+        }
758
+    }
759 759
 }
Please login to merge, or discard this patch.
Spacing   +141 added lines, -141 removed lines patch added patch discarded remove patch
@@ -42,19 +42,19 @@  discard block
 block discarded – undo
42 42
 	 * @param string $type
43 43
 	 * @param array  $elements
44 44
 	 */
45
-	public function __construct( $type, array $elements = array() ) {
46
-		$this->type = new Type( $type );
45
+	public function __construct($type, array $elements = array()) {
46
+		$this->type = new Type($type);
47 47
 
48
-		if ( $this->type->is_model() ) {
49
-			foreach ( $elements as $idx => $element ) {
50
-				if ( is_array( $element ) ) {
51
-					$elements[ $idx ] = $this->type->create_model( $element );
48
+		if ($this->type->is_model()) {
49
+			foreach ($elements as $idx => $element) {
50
+				if (is_array($element)) {
51
+					$elements[$idx] = $this->type->create_model($element);
52 52
 				}
53 53
 			}
54 54
 		}
55 55
 
56
-		if ( $elements ) {
57
-			$this->type->validate_elements( $elements );
56
+		if ($elements) {
57
+			$this->type->validate_elements($elements);
58 58
 		}
59 59
 
60 60
 		$this->elements = $elements;
@@ -78,18 +78,18 @@  discard block
 block discarded – undo
78 78
 	 *
79 79
 	 * @throws InvalidArgumentException
80 80
 	 */
81
-	public function add( $element ) {
82
-		if ( $this->type->is_model() && is_array( $element ) ) {
83
-			$element = $this->type->create_model( $element );
81
+	public function add($element) {
82
+		if ($this->type->is_model() && is_array($element)) {
83
+			$element = $this->type->create_model($element);
84 84
 		}
85 85
 
86
-		$this->type->validate_element( $element );
86
+		$this->type->validate_element($element);
87 87
 
88 88
 		$elements   = $this->elements;
89 89
 		$elements[] = $element;
90 90
 
91
-		$collection = new static( $this->get_type() );
92
-		$collection->set_from_trusted( $elements );
91
+		$collection = new static($this->get_type());
92
+		$collection->set_from_trusted($elements);
93 93
 
94 94
 		return $collection;
95 95
 	}
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
 	 * @return Collection
101 101
 	 */
102 102
 	public function clear() {
103
-		return new static( $this->get_type() );
103
+		return new static($this->get_type());
104 104
 	}
105 105
 
106 106
 	/**
@@ -110,8 +110,8 @@  discard block
 block discarded – undo
110 110
 	 *
111 111
 	 * @return bool
112 112
 	 */
113
-	public function contains( $condition ) {
114
-		return (bool) $this->find( $condition );
113
+	public function contains($condition) {
114
+		return (bool) $this->find($condition);
115 115
 	}
116 116
 
117 117
 	/**
@@ -121,10 +121,10 @@  discard block
 block discarded – undo
121 121
 	 *
122 122
 	 * @return mixed
123 123
 	 */
124
-	public function find( $condition ) {
125
-		$index = $this->find_index( $condition );
124
+	public function find($condition) {
125
+		$index = $this->find_index($condition);
126 126
 
127
-		return -1 === $index ? null : $this->elements[ $index ];
127
+		return -1 === $index ? null : $this->elements[$index];
128 128
 	}
129 129
 
130 130
 	/**
@@ -134,11 +134,11 @@  discard block
 block discarded – undo
134 134
 	 *
135 135
 	 * @return int
136 136
 	 */
137
-	public function find_index( $condition ) {
137
+	public function find_index($condition) {
138 138
 		$index = -1;
139 139
 
140
-		for ( $i = 0, $count = count( $this->elements ); $i < $count; $i++ ) {
141
-			if ( call_user_func( $condition, ($this->at( $i ) ) ) ) {
140
+		for ($i = 0, $count = count($this->elements); $i < $count; $i++) {
141
+			if (call_user_func($condition, ($this->at($i)))) {
142 142
 				$index = $i;
143 143
 				break;
144 144
 			}
@@ -156,10 +156,10 @@  discard block
 block discarded – undo
156 156
 	 *
157 157
 	 * @throws OutOfRangeException
158 158
 	 */
159
-	public function at( $index ) {
160
-		$this->validate_index( $index );
159
+	public function at($index) {
160
+		$this->validate_index($index);
161 161
 
162
-		return $this->elements[ $index ];
162
+		return $this->elements[$index];
163 163
 	}
164 164
 
165 165
 	/**
@@ -171,13 +171,13 @@  discard block
 block discarded – undo
171 171
 	 *
172 172
 	 * @throws InvalidArgumentException
173 173
 	 */
174
-	public function index_exists( $index ) {
175
-		if ( ! is_int( $index ) ) {
176
-			throw new InvalidArgumentException( 'Index must be an integer' );
174
+	public function index_exists($index) {
175
+		if (!is_int($index)) {
176
+			throw new InvalidArgumentException('Index must be an integer');
177 177
 		}
178 178
 
179
-		if ( $index < 0 ) {
180
-			throw new InvalidArgumentException( 'Index must be a non-negative integer' );
179
+		if ($index < 0) {
180
+			throw new InvalidArgumentException('Index must be a non-negative integer');
181 181
 		}
182 182
 
183 183
 		return $index < $this->count();
@@ -190,16 +190,16 @@  discard block
 block discarded – undo
190 190
 	 *
191 191
 	 * @return Collection
192 192
 	 */
193
-	public function filter( $condition ) {
193
+	public function filter($condition) {
194 194
 		$elements = array();
195 195
 
196
-		foreach ( $this->elements as $element ) {
197
-			if ( call_user_func( $condition, $element ) ) {
196
+		foreach ($this->elements as $element) {
197
+			if (call_user_func($condition, $element)) {
198 198
 				$elements[] = $element;
199 199
 			}
200 200
 		}
201 201
 
202
-		return $this->new_from_trusted( $elements );
202
+		return $this->new_from_trusted($elements);
203 203
 	}
204 204
 	/**
205 205
 	 * {@inheritdoc}
@@ -208,10 +208,10 @@  discard block
 block discarded – undo
208 208
 	 *
209 209
 	 * @return mixed
210 210
 	 */
211
-	public function find_last( $condition ) {
212
-		$index = $this->find_last_index( $condition );
211
+	public function find_last($condition) {
212
+		$index = $this->find_last_index($condition);
213 213
 
214
-		return -1 === $index ? null : $this->elements[ $index ];
214
+		return -1 === $index ? null : $this->elements[$index];
215 215
 	}
216 216
 
217 217
 	/**
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
 	 * @param  callable $condition
221 221
 	 * @return int
222 222
 	 */
223
-	public function find_last_index( $condition ) {
223
+	public function find_last_index($condition) {
224 224
 		$index = -1;
225 225
 
226
-		for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
227
-			if ( call_user_func( $condition, $this->elements[ $i ] ) ) {
226
+		for ($i = count($this->elements) - 1; $i >= 0; $i--) {
227
+			if (call_user_func($condition, $this->elements[$i])) {
228 228
 				$index = $i;
229 229
 				break;
230 230
 			}
@@ -243,26 +243,26 @@  discard block
 block discarded – undo
243 243
 	 *
244 244
 	 * @throws InvalidArgumentException
245 245
 	 */
246
-	public function slice( $start, $end ) {
247
-		if ( $start < 0 || ! is_int( $start ) ) {
248
-			throw new InvalidArgumentException( 'Start must be a non-negative integer' );
246
+	public function slice($start, $end) {
247
+		if ($start < 0 || !is_int($start)) {
248
+			throw new InvalidArgumentException('Start must be a non-negative integer');
249 249
 		}
250 250
 
251
-		if ( $end < 0 || ! is_int( $end ) ) {
252
-			throw new InvalidArgumentException( 'End must be a positive integer' );
251
+		if ($end < 0 || !is_int($end)) {
252
+			throw new InvalidArgumentException('End must be a positive integer');
253 253
 		}
254 254
 
255
-		if ( $start > $end ) {
256
-			throw new InvalidArgumentException( 'End must be greater than start' );
255
+		if ($start > $end) {
256
+			throw new InvalidArgumentException('End must be greater than start');
257 257
 		}
258 258
 
259
-		if ( $end > $this->count() + 1 ) {
260
-			throw new InvalidArgumentException( 'End must be less than the count of the items in the Collection' );
259
+		if ($end > $this->count() + 1) {
260
+			throw new InvalidArgumentException('End must be less than the count of the items in the Collection');
261 261
 		}
262 262
 
263 263
 		$length = $end - $start + 1;
264 264
 
265
-		return $this->new_from_trusted( array_slice( $this->elements, $start, $length ) );
265
+		return $this->new_from_trusted(array_slice($this->elements, $start, $length));
266 266
 	}
267 267
 
268 268
 	/**
@@ -276,16 +276,16 @@  discard block
 block discarded – undo
276 276
 	 * @throws InvalidArgumentException
277 277
 	 * @throws OutOfRangeException
278 278
 	 */
279
-	public function insert( $index, $element ) {
280
-		$this->validate_index( $index );
281
-		$this->type->validate_element( $element );
279
+	public function insert($index, $element) {
280
+		$this->validate_index($index);
281
+		$this->type->validate_element($element);
282 282
 
283
-		$a = array_slice( $this->elements, 0, $index );
284
-		$b = array_slice( $this->elements, $index, count( $this->elements ) );
283
+		$a = array_slice($this->elements, 0, $index);
284
+		$b = array_slice($this->elements, $index, count($this->elements));
285 285
 
286 286
 		$a[] = $element;
287 287
 
288
-		return $this->new_from_trusted( array_merge( $a, $b ) );
288
+		return $this->new_from_trusted(array_merge($a, $b));
289 289
 	}
290 290
 
291 291
 	/**
@@ -298,19 +298,19 @@  discard block
 block discarded – undo
298 298
 	 *
299 299
 	 * @throws OutOfRangeException
300 300
 	 */
301
-	public function insert_range( $index, array $elements ) {
302
-		$this->validate_index( $index );
303
-		$this->type->validate_elements( $elements );
301
+	public function insert_range($index, array $elements) {
302
+		$this->validate_index($index);
303
+		$this->type->validate_elements($elements);
304 304
 
305
-		if ( $index < 0 ) {
305
+		if ($index < 0) {
306 306
 			$index = $this->count() + $index + 1;
307 307
 		}
308 308
 
309 309
 		return $this->new_from_trusted(
310 310
 			array_merge(
311
-				array_slice( $this->elements, 0, $index ),
311
+				array_slice($this->elements, 0, $index),
312 312
 				$elements,
313
-				array_slice( $this->elements, $index, count( $this->elements ) )
313
+				array_slice($this->elements, $index, count($this->elements))
314 314
 			)
315 315
 		);
316 316
 	}
@@ -322,12 +322,12 @@  discard block
 block discarded – undo
322 322
 	 *
323 323
 	 * @return Collection
324 324
 	 */
325
-	public function reject( $condition ) {
326
-		$inverse = function ( $element ) use ( $condition ) {
327
-			return ! call_user_func( $condition, $element );
325
+	public function reject($condition) {
326
+		$inverse = function($element) use ($condition) {
327
+			return !call_user_func($condition, $element);
328 328
 		};
329 329
 
330
-		return $this->filter( $inverse );
330
+		return $this->filter($inverse);
331 331
 	}
332 332
 
333 333
 	/**
@@ -339,15 +339,15 @@  discard block
 block discarded – undo
339 339
 	 *
340 340
 	 * @throws OutOfRangeException
341 341
 	 */
342
-	public function remove_at( $index ) {
343
-		$this->validate_index( $index );
342
+	public function remove_at($index) {
343
+		$this->validate_index($index);
344 344
 
345 345
 		$elements = $this->elements;
346 346
 
347 347
 		return $this->new_from_trusted(
348 348
 			array_merge(
349
-				array_slice( $elements, 0, $index ),
350
-				array_slice( $elements, $index + 1, count( $elements ) )
349
+				array_slice($elements, 0, $index),
350
+				array_slice($elements, $index + 1, count($elements))
351 351
 			)
352 352
 		);
353 353
 	}
@@ -358,7 +358,7 @@  discard block
 block discarded – undo
358 358
 	 */
359 359
 	public function reverse() {
360 360
 		return $this->new_from_trusted(
361
-			array_reverse( $this->elements )
361
+			array_reverse($this->elements)
362 362
 		);
363 363
 	}
364 364
 
@@ -369,10 +369,10 @@  discard block
 block discarded – undo
369 369
 	 *
370 370
 	 * @return Collection
371 371
 	 */
372
-	public function sort( $callback ) {
372
+	public function sort($callback) {
373 373
 		$elements = $this->elements;
374
-		usort( $elements, $callback );
375
-		return $this->new_from_trusted( $elements );
374
+		usort($elements, $callback);
375
+		return $this->new_from_trusted($elements);
376 376
 	}
377 377
 
378 378
 	/**
@@ -393,8 +393,8 @@  discard block
 block discarded – undo
393 393
 	 *
394 394
 	 * @return mixed
395 395
 	 */
396
-	public function reduce( $callable, $initial = null ) {
397
-		return array_reduce( $this->elements, $callable, $initial );
396
+	public function reduce($callable, $initial = null) {
397
+		return array_reduce($this->elements, $callable, $initial);
398 398
 	}
399 399
 
400 400
 	/**
@@ -404,13 +404,13 @@  discard block
 block discarded – undo
404 404
 	 *
405 405
 	 * @return bool
406 406
 	 */
407
-	public function every( $condition ) {
407
+	public function every($condition) {
408 408
 		$response = true;
409 409
 
410
-		foreach ( $this->elements as $element ) {
411
-			$result = call_user_func( $condition, $element );
410
+		foreach ($this->elements as $element) {
411
+			$result = call_user_func($condition, $element);
412 412
 
413
-			if ( false === $result ) {
413
+			if (false === $result) {
414 414
 				$response = false;
415 415
 				break;
416 416
 			}
@@ -428,12 +428,12 @@  discard block
 block discarded – undo
428 428
 	 *
429 429
 	 * @throws InvalidArgumentException
430 430
 	 */
431
-	public function drop( $num ) {
432
-		if ( $num > $this->count() ) {
431
+	public function drop($num) {
432
+		if ($num > $this->count()) {
433 433
 			$num = $this->count();
434 434
 		}
435 435
 
436
-		return $this->slice( $num, $this->count() );
436
+		return $this->slice($num, $this->count());
437 437
 	}
438 438
 
439 439
 	/**
@@ -445,9 +445,9 @@  discard block
 block discarded – undo
445 445
 	 *
446 446
 	 * @throws InvalidArgumentException
447 447
 	 */
448
-	public function drop_right( $num ) {
448
+	public function drop_right($num) {
449 449
 		return $num !== $this->count()
450
-			? $this->slice( 0, $this->count() - $num - 1 )
450
+			? $this->slice(0, $this->count() - $num - 1)
451 451
 			: $this->clear();
452 452
 	}
453 453
 
@@ -458,9 +458,9 @@  discard block
 block discarded – undo
458 458
 	 *
459 459
 	 * @return Collection
460 460
 	 */
461
-	public function drop_while( $condition ) {
462
-		$count = $this->count_while_true( $condition );
463
-		return $count ? $this->drop( $count ) : $this;
461
+	public function drop_while($condition) {
462
+		$count = $this->count_while_true($condition);
463
+		return $count ? $this->drop($count) : $this;
464 464
 	}
465 465
 	/**
466 466
 	 * {@inheritdoc}
@@ -470,7 +470,7 @@  discard block
 block discarded – undo
470 470
 	 * @throws InvalidArgumentException
471 471
 	 */
472 472
 	public function tail() {
473
-		return $this->slice( 1, $this->count() );
473
+		return $this->slice(1, $this->count());
474 474
 	}
475 475
 
476 476
 	/**
@@ -482,8 +482,8 @@  discard block
 block discarded – undo
482 482
 	 *
483 483
 	 * @throws InvalidArgumentException
484 484
 	 */
485
-	public function take( $num ) {
486
-		return $this->slice( 0, $num - 1 );
485
+	public function take($num) {
486
+		return $this->slice(0, $num - 1);
487 487
 	}
488 488
 
489 489
 	/**
@@ -495,8 +495,8 @@  discard block
 block discarded – undo
495 495
 	 *
496 496
 	 * @throws InvalidArgumentException
497 497
 	 */
498
-	public function take_right( $num ) {
499
-		return $this->slice( $this->count() - $num, $this->count() );
498
+	public function take_right($num) {
499
+		return $this->slice($this->count() - $num, $this->count());
500 500
 	}
501 501
 
502 502
 	/**
@@ -506,10 +506,10 @@  discard block
 block discarded – undo
506 506
 	 *
507 507
 	 * @return Collection
508 508
 	 */
509
-	public function take_while( $condition ) {
510
-		$count = $this->count_while_true( $condition );
509
+	public function take_while($condition) {
510
+		$count = $this->count_while_true($condition);
511 511
 
512
-		return $count ? $this->take( $count ) : $this->clear();
512
+		return $count ? $this->take($count) : $this->clear();
513 513
 	}
514 514
 
515 515
 	/**
@@ -517,9 +517,9 @@  discard block
 block discarded – undo
517 517
 	 *
518 518
 	 * @param callable $callable Callback function.
519 519
 	 */
520
-	public function each( $callable ) {
521
-		foreach ( $this->elements as $element ) {
522
-			call_user_func( $callable, $element );
520
+	public function each($callable) {
521
+		foreach ($this->elements as $element) {
522
+			call_user_func($callable, $element);
523 523
 		}
524 524
 	}
525 525
 
@@ -530,24 +530,24 @@  discard block
 block discarded – undo
530 530
 	 *
531 531
 	 * @return Collection
532 532
 	 */
533
-	public function map( $callable ) {
533
+	public function map($callable) {
534 534
 		$elements = array();
535 535
 		$type = null;
536
-		foreach ( $this->elements as $element ) {
537
-			$result = call_user_func( $callable, $element );
536
+		foreach ($this->elements as $element) {
537
+			$result = call_user_func($callable, $element);
538 538
 
539
-			if ( null === $type ) {
540
-				$type = gettype( $result );
539
+			if (null === $type) {
540
+				$type = gettype($result);
541 541
 
542
-				if ( 'object' === $type ) {
543
-					$type = get_class( $result );
542
+				if ('object' === $type) {
543
+					$type = get_class($result);
544 544
 				}
545 545
 			}
546 546
 
547 547
 			$elements[] = $result;
548 548
 		}
549 549
 
550
-		return $this->new_from_trusted( $elements, $type ? : $this->get_type() );
550
+		return $this->new_from_trusted($elements, $type ?: $this->get_type());
551 551
 	}
552 552
 
553 553
 	/**
@@ -558,9 +558,9 @@  discard block
 block discarded – undo
558 558
 	 *
559 559
 	 * @return mixed
560 560
 	 */
561
-	public function reduce_right( $callable, $initial = null ) {
561
+	public function reduce_right($callable, $initial = null) {
562 562
 		return array_reduce(
563
-			array_reverse( $this->elements ),
563
+			array_reverse($this->elements),
564 564
 			$callable,
565 565
 			$initial
566 566
 		);
@@ -573,9 +573,9 @@  discard block
 block discarded – undo
573 573
 	 */
574 574
 	public function shuffle() {
575 575
 		$elements = $this->elements;
576
-		shuffle( $elements );
576
+		shuffle($elements);
577 577
 
578
-		return $this->new_from_trusted( $elements );
578
+		return $this->new_from_trusted($elements);
579 579
 	}
580 580
 
581 581
 	/**
@@ -587,19 +587,19 @@  discard block
 block discarded – undo
587 587
 	 *
588 588
 	 * @throws InvalidArgumentException
589 589
 	 */
590
-	public function merge( $elements ) {
591
-		if ( $elements instanceof static ) {
590
+	public function merge($elements) {
591
+		if ($elements instanceof static) {
592 592
 			$elements = $elements->to_array();
593 593
 		}
594 594
 
595
-		if ( ! is_array( $elements ) ) {
596
-			throw new InvalidArgumentException( 'Merge must be given array or Collection' );
595
+		if (!is_array($elements)) {
596
+			throw new InvalidArgumentException('Merge must be given array or Collection');
597 597
 		}
598 598
 
599
-		$this->type->validate_elements( $elements );
599
+		$this->type->validate_elements($elements);
600 600
 
601 601
 		return $this->new_from_trusted(
602
-			array_merge( $this->elements, $elements )
602
+			array_merge($this->elements, $elements)
603 603
 		);
604 604
 	}
605 605
 
@@ -611,11 +611,11 @@  discard block
 block discarded – undo
611 611
 	 * @throws OutOfBoundsException
612 612
 	 */
613 613
 	public function first() {
614
-		if ( empty( $this->elements ) ) {
615
-			throw new OutOfBoundsException( 'Cannot get first element of empty Collection' );
614
+		if (empty($this->elements)) {
615
+			throw new OutOfBoundsException('Cannot get first element of empty Collection');
616 616
 		}
617 617
 
618
-		return reset( $this->elements );
618
+		return reset($this->elements);
619 619
 	}
620 620
 
621 621
 	/**
@@ -626,11 +626,11 @@  discard block
 block discarded – undo
626 626
 	 * @throws OutOfBoundsException
627 627
 	 */
628 628
 	public function last() {
629
-		if ( empty( $this->elements ) ) {
630
-			throw new OutOfBoundsException( 'Cannot get last element of empty Collection' );
629
+		if (empty($this->elements)) {
630
+			throw new OutOfBoundsException('Cannot get last element of empty Collection');
631 631
 		}
632 632
 
633
-		return end( $this->elements );
633
+		return end($this->elements);
634 634
 	}
635 635
 
636 636
 	/**
@@ -639,7 +639,7 @@  discard block
 block discarded – undo
639 639
 	 * @return int
640 640
 	 */
641 641
 	public function count() {
642
-		return count( $this->elements );
642
+		return count($this->elements);
643 643
 	}
644 644
 
645 645
 	/**
@@ -648,8 +648,8 @@  discard block
 block discarded – undo
648 648
 	 * @return array
649 649
 	 */
650 650
 	public function serialize() {
651
-		return $this->map(function( $element ) {
652
-			if ( $element instanceof Serializes ) {
651
+		return $this->map(function($element) {
652
+			if ($element instanceof Serializes) {
653 653
 				return $element->serialize();
654 654
 			}
655 655
 
@@ -663,14 +663,14 @@  discard block
 block discarded – undo
663 663
 	 * @return mixed
664 664
 	 */
665 665
 	public function current() {
666
-		return $this->at( $this->position );
666
+		return $this->at($this->position);
667 667
 	}
668 668
 
669 669
 	/**
670 670
 	 * Move forward to next element.
671 671
 	 */
672 672
 	public function next() {
673
-		$this->position ++;
673
+		$this->position++;
674 674
 	}
675 675
 
676 676
 	/**
@@ -688,7 +688,7 @@  discard block
 block discarded – undo
688 688
 	 * @return bool
689 689
 	 */
690 690
 	public function valid() {
691
-		return isset( $this->elements[ $this->position ] );
691
+		return isset($this->elements[$this->position]);
692 692
 	}
693 693
 
694 694
 	/**
@@ -707,9 +707,9 @@  discard block
 block discarded – undo
707 707
 	 *
708 708
 	 * @return static
709 709
 	 */
710
-	protected function new_from_trusted( array $elements, $type = null ) {
711
-		$collection = new static( null !== $type ? $type : $this->get_type() );
712
-		$collection->set_from_trusted( $elements );
710
+	protected function new_from_trusted(array $elements, $type = null) {
711
+		$collection = new static(null !== $type ? $type : $this->get_type());
712
+		$collection->set_from_trusted($elements);
713 713
 
714 714
 		return $collection;
715 715
 	}
@@ -719,7 +719,7 @@  discard block
 block discarded – undo
719 719
 	 *
720 720
 	 * @param array $elements Pre-validated elements to set.
721 721
 	 */
722
-	protected function set_from_trusted( array $elements ) {
722
+	protected function set_from_trusted(array $elements) {
723 723
 		$this->elements = $elements;
724 724
 	}
725 725
 
@@ -729,11 +729,11 @@  discard block
 block discarded – undo
729 729
 	 * @param callable $condition Condition to check.
730 730
 	 * @return int
731 731
 	 */
732
-	protected function count_while_true( $condition ) {
732
+	protected function count_while_true($condition) {
733 733
 		$count = 0;
734 734
 
735
-		foreach ( $this->elements as $element ) {
736
-			if ( ! $condition($element) ) {
735
+		foreach ($this->elements as $element) {
736
+			if (!$condition($element)) {
737 737
 				break;
738 738
 			}
739 739
 			$count++;
@@ -749,11 +749,11 @@  discard block
 block discarded – undo
749 749
 	 *
750 750
 	 * @throws OutOfRangeException
751 751
 	 */
752
-	protected function validate_index( $index ) {
753
-		$exists = $this->index_exists( $index );
752
+	protected function validate_index($index) {
753
+		$exists = $this->index_exists($index);
754 754
 
755
-		if ( ! $exists ) {
756
-			throw new OutOfRangeException( 'Index out of bounds of collection' );
755
+		if (!$exists) {
756
+			throw new OutOfRangeException('Index out of bounds of collection');
757 757
 		}
758 758
 	}
759 759
 }
Please login to merge, or discard this patch.
src/Axolotl/Model.php 3 patches
Unused Use Statements   -1 removed lines patch added patch discarded remove patch
@@ -1,7 +1,6 @@
 block discarded – undo
1 1
 <?php
2 2
 namespace Intraxia\Jaxion\Axolotl;
3 3
 
4
-use Exception;
5 4
 use Intraxia\Jaxion\Contract\Axolotl\Serializes;
6 5
 use Intraxia\Jaxion\Contract\Axolotl\UsesCustomTable;
7 6
 use Intraxia\Jaxion\Contract\Axolotl\UsesWordPressPost;
Please login to merge, or discard this patch.
Indentation   +730 added lines, -730 removed lines patch added patch discarded remove patch
@@ -22,734 +22,734 @@
 block discarded – undo
22 22
  * @since      0.1.0
23 23
  */
24 24
 abstract class Model implements Serializes {
25
-	/**
26
-	 * Table attribute key.
27
-	 */
28
-	const TABLE_KEY = '@@table';
29
-
30
-	/**
31
-	 * Object attribute key.
32
-	 */
33
-	const OBJECT_KEY = '@@object';
34
-
35
-	/**
36
-	 * Memoized values for class methods.
37
-	 *
38
-	 * @var array
39
-	 */
40
-	private static $memo = array();
41
-
42
-	/**
43
-	 * Model attributes.
44
-	 *
45
-	 * @var array
46
-	 */
47
-	private $attributes = array(
48
-		self::TABLE_KEY  => array(),
49
-		self::OBJECT_KEY => null,
50
-	);
51
-
52
-	/**
53
-	 * Model's original attributes.
54
-	 *
55
-	 * @var array
56
-	 */
57
-	private $original = array(
58
-		self::TABLE_KEY  => array(),
59
-		self::OBJECT_KEY => null,
60
-	);
61
-
62
-	/**
63
-	 * Default attribute values.
64
-	 *
65
-	 * @var array
66
-	 */
67
-	protected $defaults = array();
68
-
69
-	/**
70
-	 * Properties which are allowed to be set on the model.
71
-	 *
72
-	 * If this array is empty, any attributes can be set on the model.
73
-	 *
74
-	 * @var string[]
75
-	 */
76
-	protected $fillable = array();
77
-
78
-	/**
79
-	 * Properties which cannot be automatically filled on the model.
80
-	 *
81
-	 * If the model is unguarded, these properties can be filled.
82
-	 *
83
-	 * @var array
84
-	 */
85
-	protected $guarded = array();
86
-
87
-	/**
88
-	 * Properties which should not be serialized.
89
-	 *
90
-	 * @var array
91
-	 */
92
-	protected $hidden = array();
93
-
94
-	/**
95
-	 * Properties which should be serialized.
96
-	 *
97
-	 * @var array
98
-	 */
99
-	protected $visible = array();
100
-
101
-	/**
102
-	 * Whether the model's properties are guarded.
103
-	 *
104
-	 * When false, allows guarded properties to be filled.
105
-	 *
106
-	 * @var bool
107
-	 */
108
-	protected $is_guarded = true;
109
-
110
-	/**
111
-	 * Constructs a new model with provided attributes.
112
-	 *
113
-	 * If self::OBJECT_KEY is passed as one of the attributes, the underlying post
114
-	 * will be overwritten.
115
-	 *
116
-	 * @param array <string, mixed> $attributes
117
-	 */
118
-	public function __construct( array $attributes = array() ) {
119
-		$this->maybe_boot();
120
-		$this->sync_original();
121
-
122
-		if ( $this->uses_wp_object() ) {
123
-			$this->create_wp_object();
124
-		}
125
-
126
-		$this->unguard();
127
-		$this->refresh( $attributes );
128
-		$this->reguard();
129
-	}
130
-
131
-	/**
132
-	 * Refreshes the model's current attributes with the provided array.
133
-	 *
134
-	 * The model's attributes will match what was provided in the array,
135
-	 * and any attributes not passed
136
-	 *
137
-	 * @param array $attributes
138
-	 *
139
-	 * @return $this
140
-	 */
141
-	public function refresh( array $attributes ) {
142
-		$this->clear();
143
-
144
-		return $this->merge( $attributes );
145
-	}
146
-
147
-	/**
148
-	 * Merges the provided attributes with the provided array.
149
-	 *
150
-	 * @param array $attributes
151
-	 *
152
-	 * @return $this
153
-	 */
154
-	public function merge( array $attributes ) {
155
-		foreach ( $attributes as $name => $value ) {
156
-			$this->set_attribute( $name, $value );
157
-		}
158
-
159
-		return $this;
160
-	}
161
-
162
-	/**
163
-	 * Get the model's table attributes.
164
-	 *
165
-	 * Returns the array of for the model that will either need to be
166
-	 * saved in postmeta or a separate table.
167
-	 *
168
-	 * @return array
169
-	 */
170
-	public function get_table_attributes() {
171
-		return $this->attributes[ self::TABLE_KEY ];
172
-	}
173
-
174
-	/**
175
-	 * Get the model's original attributes.
176
-	 *
177
-	 * @return array
178
-	 */
179
-	public function get_original_table_attributes() {
180
-		return $this->original[ self::TABLE_KEY ];
181
-	}
182
-
183
-	/**
184
-	 * Retrieve an array of the attributes on the model
185
-	 * that have changed compared to the model's
186
-	 * original data.
187
-	 *
188
-	 * @return array
189
-	 */
190
-	public function get_changed_table_attributes() {
191
-		$changed = array();
192
-
193
-		foreach ( $this->get_table_attributes() as $key => $value ) {
194
-			if ( $value !==
195
-				 $this->get_original_attribute( $key )
196
-			) {
197
-				$changed[ $key ] = $value;
198
-			}
199
-		}
200
-
201
-		return $changed;
202
-	}
203
-
204
-	/**
205
-	 * Get the model's underlying post.
206
-	 *
207
-	 * Returns the underlying WP_Post object for the model, representing
208
-	 * the data that will be save in the wp_posts table.
209
-	 *
210
-	 * @return false|WP_Post|WP_Term
211
-	 */
212
-	public function get_underlying_wp_object() {
213
-		if ( isset( $this->attributes[ self::OBJECT_KEY ] ) ) {
214
-			return $this->attributes[ self::OBJECT_KEY ];
215
-		}
216
-
217
-		return false;
218
-	}
219
-
220
-	/**
221
-	 * Get the model's original underlying post.
222
-	 *
223
-	 * @return WP_Post
224
-	 */
225
-	public function get_original_underlying_wp_object() {
226
-		return $this->original[ self::OBJECT_KEY ];
227
-	}
228
-
229
-	/**
230
-	 * Get the model attributes on the WordPress object
231
-	 * that have changed compared to the model's
232
-	 * original attributes.
233
-	 *
234
-	 * @return array
235
-	 */
236
-	public function get_changed_wp_object_attributes() {
237
-		$changed = array();
238
-
239
-		foreach ( $this->get_wp_object_keys() as $key ) {
240
-			if ( $this->get_attribute( $key ) !==
241
-				 $this->get_original_attribute( $key )
242
-			) {
243
-				$changed[ $key ] = $this->get_attribute( $key );
244
-			}
245
-		}
246
-
247
-		return $changed;
248
-	}
249
-
250
-	/**
251
-	 * Magic __set method.
252
-	 *
253
-	 * Passes the name and value to set_attribute, which is where the magic happens.
254
-	 *
255
-	 * @param string $name
256
-	 * @param mixed  $value
257
-	 */
258
-	public function __set( $name, $value ) {
259
-		$this->set_attribute( $name, $value );
260
-	}
261
-
262
-	/**
263
-	 * Sets the model attributes.
264
-	 *
265
-	 * Checks whether the model attribute can be set, check if it
266
-	 * maps to the WP_Post property, otherwise, assigns it to the
267
-	 * table attribute array.
268
-	 *
269
-	 * @param string $name
270
-	 * @param mixed  $value
271
-	 *
272
-	 * @return $this
273
-	 *
274
-	 * @throws GuardedPropertyException
275
-	 */
276
-	public function set_attribute( $name, $value ) {
277
-		if ( self::OBJECT_KEY === $name ) {
278
-			return $this->override_wp_object( $value );
279
-		}
280
-
281
-		if ( self::TABLE_KEY === $name ) {
282
-			return $this->override_table( $value );
283
-		}
284
-
285
-		if ( ! $this->is_fillable( $name ) ) {
286
-			throw new GuardedPropertyException;
287
-		}
288
-
289
-		if ( $method = $this->has_map_method( $name ) ) {
290
-			$this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()} = $value;
291
-		} else {
292
-			$this->attributes[ self::TABLE_KEY ][ $name ] = $value;
293
-		}
294
-
295
-		return $this;
296
-	}
297
-
298
-	/**
299
-	 * Retrieves all the attribute keys for the model.
300
-	 *
301
-	 * @return array
302
-	 */
303
-	public function get_attribute_keys() {
304
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
305
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
306
-		}
307
-
308
-		return self::$memo[ get_called_class() ][ __METHOD__ ]
309
-			= array_merge(
310
-				$this->fillable,
311
-				$this->guarded,
312
-				$this->get_compute_methods()
313
-			);
314
-	}
315
-
316
-	/**
317
-	 * Retrieves the attribute keys that aren't mapped to a post.
318
-	 *
319
-	 * @return array
320
-	 */
321
-	public function get_table_keys() {
322
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
323
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
324
-		}
325
-
326
-		$keys = array();
327
-
328
-		foreach ( $this->get_attribute_keys() as $key ) {
329
-			if ( ! $this->has_map_method( $key ) &&
330
-				 ! $this->has_compute_method( $key )
331
-			) {
332
-				$keys[] = $key;
333
-			}
334
-		}
335
-
336
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
337
-	}
338
-
339
-	/**
340
-	 * Retrieves the attribute keys that are mapped to a post.
341
-	 *
342
-	 * @return array
343
-	 */
344
-	public function get_wp_object_keys() {
345
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
346
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
347
-		}
348
-
349
-		$keys = array();
350
-
351
-		foreach ( $this->get_attribute_keys() as $key ) {
352
-			if ( $this->has_map_method( $key ) ) {
353
-				$keys[] = $key;
354
-			}
355
-		}
356
-
357
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
358
-	}
359
-
360
-	/**
361
-	 * Returns the model's keys that are computed at call time.
362
-	 *
363
-	 * @return array
364
-	 */
365
-	public function get_computed_keys() {
366
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
367
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
368
-		}
369
-
370
-		$keys = array();
371
-
372
-		foreach ( $this->get_attribute_keys() as $key ) {
373
-			if ( $this->has_compute_method( $key ) ) {
374
-				$keys[] = $key;
375
-			}
376
-		}
377
-
378
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
379
-	}
380
-
381
-	/**
382
-	 * Serializes the model's public data into an array.
383
-	 *
384
-	 * @return array
385
-	 */
386
-	public function serialize() {
387
-		$attributes = array();
388
-
389
-		if ( $this->visible ) {
390
-			// If visible attributes are set, we'll only reveal those.
391
-			foreach ( $this->visible as $key ) {
392
-				$attributes[ $key ] = $this->get_attribute( $key );
393
-			}
394
-		} elseif ( $this->hidden ) {
395
-			// If hidden attributes are set, we'll grab everything and hide those.
396
-			foreach ( $this->get_attribute_keys() as $key ) {
397
-				if ( ! in_array( $key, $this->hidden ) ) {
398
-					$attributes[ $key ] = $this->get_attribute( $key );
399
-				}
400
-			}
401
-		} else {
402
-			// If nothing is hidden/visible, we'll grab and reveal everything.
403
-			foreach ( $this->get_attribute_keys() as $key ) {
404
-				$attributes[ $key ] = $this->get_attribute( $key );
405
-			}
406
-		}
407
-
408
-		return array_map( function ( $attribute ) {
409
-			if ( $attribute instanceof Serializes ) {
410
-				return $attribute->serialize();
411
-			}
412
-
413
-			return $attribute;
414
-		}, $attributes );
415
-	}
416
-
417
-	/**
418
-	 * Syncs the current attributes to the model's original.
419
-	 *
420
-	 * @return $this
421
-	 */
422
-	public function sync_original() {
423
-		$this->original = $this->attributes;
424
-
425
-		if ( $this->attributes[ self::OBJECT_KEY ] ) {
426
-			$this->original[ self::OBJECT_KEY ] = clone $this->attributes[ self::OBJECT_KEY ];
427
-		}
428
-
429
-		foreach ( $this->original[ self::TABLE_KEY ] as $key => $item ) {
430
-			if ( is_object( $item ) ) {
431
-				$this->original[ $key ] = clone $item;
432
-			}
433
-		}
434
-
435
-		return $this;
436
-	}
437
-
438
-	/**
439
-	 * Checks if a given attribute is mass-fillable.
440
-	 *
441
-	 * Returns true if the attribute can be filled, false if it can't.
442
-	 *
443
-	 * @param string $name
444
-	 *
445
-	 * @return bool
446
-	 */
447
-	private function is_fillable( $name ) {
448
-		// If this model isn't guarded, everything is fillable.
449
-		if ( ! $this->is_guarded ) {
450
-			return true;
451
-		}
452
-
453
-		// If it's in the fillable array, then it's fillable.
454
-		if ( in_array( $name, $this->fillable ) ) {
455
-			return true;
456
-		}
457
-
458
-		// If it's explicitly guarded, then it's not fillable.
459
-		if ( in_array( $name, $this->guarded ) ) {
460
-			return false;
461
-		}
462
-
463
-		// If fillable hasn't been defined, then everything else fillable.
464
-		return ! $this->fillable;
465
-	}
466
-
467
-	/**
468
-	 * Overrides the current WordPress object with a provided one.
469
-	 *
470
-	 * Resets the post's default values and stores it in the attributes.
471
-	 *
472
-	 * @param WP_Post|WP_Term|null $value
473
-	 *
474
-	 * @return $this
475
-	 */
476
-	private function override_wp_object( $value ) {
477
-		if ( is_object( $value ) ) {
478
-			$this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $value );
479
-		} else {
480
-			$this->attributes[ self::OBJECT_KEY ] = null;
481
-
482
-			if ( $this->uses_wp_object() ) {
483
-				$this->create_wp_object();
484
-			}
485
-		}
486
-
487
-		return $this;
488
-	}
489
-
490
-	/**
491
-	 * Overrides the current table attributes array with a provided one.
492
-	 *
493
-	 * @param array $value
494
-	 *
495
-	 * @return $this
496
-	 */
497
-	private function override_table( array $value ) {
498
-		$this->attributes[ self::TABLE_KEY ] = $value;
499
-
500
-		return $this;
501
-	}
502
-
503
-	/**
504
-	 * Create and set with a new blank post.
505
-	 *
506
-	 * Creates a new WP_Post object, assigns it the default attributes,
507
-	 * and stores it in the attributes.
508
-	 *
509
-	 * @throws LogicException
510
-	 */
511
-	private function create_wp_object() {
512
-		switch ( true ) {
513
-			case $this instanceof UsesWordPressPost:
514
-				$object = new WP_Post( (object) array() );
515
-				break;
516
-			case $this instanceof UsesWordPressTerm:
517
-				$object = new WP_Term( (object) array() );
518
-				break;
519
-			default:
520
-				throw new LogicException;
521
-				break;
522
-		}
523
-
524
-		$this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $object );
525
-	}
526
-
527
-	/**
528
-	 * Enforces values on the post that can't change.
529
-	 *
530
-	 * Primarily, this is used to make sure the post_type always maps
531
-	 * to the model's "$type" property, but this can all be overridden
532
-	 * by the developer to enforce other values in the model.
533
-	 *
534
-	 * @param object $object
535
-	 *
536
-	 * @return object
537
-	 */
538
-	protected function set_wp_object_constants( $object ) {
539
-		if ( $this instanceof UsesWordPressPost ) {
540
-			$object->post_type = static::get_post_type();
541
-		}
542
-
543
-		if ( $this instanceof UsesWordPressTerm ) {
544
-			$object->taxonomy = static::get_taxonomy();
545
-		}
546
-
547
-		return $object;
548
-	}
549
-
550
-	/**
551
-	 * Magic __get method.
552
-	 *
553
-	 * Passes the name and value to get_attribute, which is where the magic happens.
554
-	 *
555
-	 * @param string $name
556
-	 *
557
-	 * @return mixed
558
-	 */
559
-	public function __get( $name ) {
560
-		return $this->get_attribute( $name );
561
-	}
562
-
563
-	/**
564
-	 * Retrieves the model attribute.
565
-	 *
566
-	 * @param string $name
567
-	 *
568
-	 * @return mixed
569
-	 *
570
-	 * @throws PropertyDoesNotExistException If property isn't found.
571
-	 */
572
-	public function get_attribute( $name ) {
573
-		if ( $method = $this->has_map_method( $name ) ) {
574
-			return $this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()};
575
-		}
576
-
577
-		if ( $method = $this->has_compute_method( $name ) ) {
578
-			return $this->{$method}();
579
-		}
580
-
581
-		if ( isset( $this->attributes[ self::TABLE_KEY ][ $name ] ) ) {
582
-			return $this->attributes[ self::TABLE_KEY ][ $name ];
583
-		}
584
-
585
-		if ( isset( $this->defaults[ $name ] ) ) {
586
-			return $this->defaults[ $name ];
587
-		}
588
-
589
-		return null;
590
-	}
591
-
592
-	/**
593
-	 * Retrieve the model's original attribute value.
594
-	 *
595
-	 * @param string $name
596
-	 *
597
-	 * @return mixed
598
-	 *
599
-	 * @throws PropertyDoesNotExistException If property isn't found.
600
-	 */
601
-	public function get_original_attribute( $name ) {
602
-		$original_attributes = $this->original;
603
-
604
-		if ( ! is_object( $original_attributes[ static::OBJECT_KEY ] ) ) {
605
-			unset( $original_attributes[ static::OBJECT_KEY ] );
606
-		}
607
-
608
-		$original = new static( $original_attributes );
609
-
610
-		return $original->get_attribute( $name );
611
-	}
612
-
613
-	/**
614
-	 * Fetches the Model's primary ID, depending on the model
615
-	 * implementation.
616
-	 *
617
-	 * @return int
618
-	 *
619
-	 * @throws LogicException
620
-	 */
621
-	public function get_primary_id() {
622
-		if ( $this instanceof UsesWordPressPost ) {
623
-			return $this->get_underlying_wp_object()->ID;
624
-		}
625
-
626
-		if ( $this instanceof UsesWordPressTerm ) {
627
-			return $this->get_underlying_wp_object()->term_id;
628
-		}
629
-
630
-		if ( $this instanceof UsesCustomTable ) {
631
-			return $this->get_attribute( $this->get_primary_key() );
632
-		}
633
-
634
-		// Model w/o wp_object not yet supported.
635
-		throw new LogicException;
636
-	}
637
-
638
-	/**
639
-	 * Checks whether the attribute has a map method.
640
-	 *
641
-	 * This is used to determine whether the attribute maps to a
642
-	 * property on the underlying WP_Post object. Returns the
643
-	 * method if one exists, returns false if it doesn't.
644
-	 *
645
-	 * @param string $name
646
-	 *
647
-	 * @return false|string
648
-	 */
649
-	protected function has_map_method( $name ) {
650
-		if ( method_exists( $this, $method = "map_{$name}" ) ) {
651
-			return $method;
652
-		}
653
-
654
-		return false;
655
-	}
656
-
657
-	/**
658
-	 * Checks whether the attribute has a compute method.
659
-	 *
660
-	 * This is used to determine if the attribute should be computed
661
-	 * from other attributes.
662
-	 *
663
-	 * @param string $name
664
-	 *
665
-	 * @return false|string
666
-	 */
667
-	protected function has_compute_method( $name ) {
668
-		if ( method_exists( $this, $method = "compute_{$name}" ) ) {
669
-			return $method;
670
-		}
671
-
672
-		return false;
673
-	}
674
-
675
-	/**
676
-	 * Clears all the current attributes from the model.
677
-	 *
678
-	 * This does not touch the model's original attributes, and will
679
-	 * only clear fillable attributes, unless the model is unguarded.
680
-	 *
681
-	 * @return $this
682
-	 */
683
-	public function clear() {
684
-		$keys = array_merge(
685
-			$this->get_table_keys(),
686
-			$this->get_wp_object_keys()
687
-		);
688
-
689
-		foreach ( $keys as $key ) {
690
-			try {
691
-				$this->set_attribute( $key, null );
692
-			} catch ( GuardedPropertyException $e ) {
693
-				// We won't clear out guarded attributes.
694
-			}
695
-		}
696
-
697
-		return $this;
698
-	}
699
-
700
-	/**
701
-	 * Unguards the model.
702
-	 *
703
-	 * Sets the model to be unguarded, allowing the filling of
704
-	 * guarded attributes.
705
-	 */
706
-	public function unguard() {
707
-		$this->is_guarded = false;
708
-	}
709
-
710
-	/**
711
-	 * Reguards the model.
712
-	 *
713
-	 * Sets the model to be guarded, preventing filling of
714
-	 * guarded attributes.
715
-	 */
716
-	public function reguard() {
717
-		$this->is_guarded = true;
718
-	}
719
-
720
-	/**
721
-	 * Retrieves all the compute methods on the model.
722
-	 *
723
-	 * @return array
724
-	 */
725
-	protected function get_compute_methods() {
726
-		$methods = get_class_methods( get_called_class() );
727
-		$methods = array_filter( $methods, function ( $method ) {
728
-			return strrpos( $method, 'compute_', - strlen( $method ) ) !== false;
729
-		} );
730
-		$methods = array_map( function ( $method ) {
731
-			return substr( $method, strlen( 'compute_' ) );
732
-		}, $methods );
733
-
734
-		return $methods;
735
-	}
736
-
737
-	/**
738
-	 * Sets up the memo array for the creating model.
739
-	 */
740
-	private function maybe_boot() {
741
-		if ( ! isset( self::$memo[ get_called_class() ] ) ) {
742
-			self::$memo[ get_called_class() ] = array();
743
-		}
744
-	}
745
-
746
-	/**
747
-	 * Whether this Model uses an underlying WordPress object.
748
-	 *
749
-	 * @return bool
750
-	 */
751
-	protected function uses_wp_object() {
752
-		return $this instanceof UsesWordPressPost ||
753
-			$this instanceof UsesWordPressTerm;
754
-	}
25
+    /**
26
+     * Table attribute key.
27
+     */
28
+    const TABLE_KEY = '@@table';
29
+
30
+    /**
31
+     * Object attribute key.
32
+     */
33
+    const OBJECT_KEY = '@@object';
34
+
35
+    /**
36
+     * Memoized values for class methods.
37
+     *
38
+     * @var array
39
+     */
40
+    private static $memo = array();
41
+
42
+    /**
43
+     * Model attributes.
44
+     *
45
+     * @var array
46
+     */
47
+    private $attributes = array(
48
+        self::TABLE_KEY  => array(),
49
+        self::OBJECT_KEY => null,
50
+    );
51
+
52
+    /**
53
+     * Model's original attributes.
54
+     *
55
+     * @var array
56
+     */
57
+    private $original = array(
58
+        self::TABLE_KEY  => array(),
59
+        self::OBJECT_KEY => null,
60
+    );
61
+
62
+    /**
63
+     * Default attribute values.
64
+     *
65
+     * @var array
66
+     */
67
+    protected $defaults = array();
68
+
69
+    /**
70
+     * Properties which are allowed to be set on the model.
71
+     *
72
+     * If this array is empty, any attributes can be set on the model.
73
+     *
74
+     * @var string[]
75
+     */
76
+    protected $fillable = array();
77
+
78
+    /**
79
+     * Properties which cannot be automatically filled on the model.
80
+     *
81
+     * If the model is unguarded, these properties can be filled.
82
+     *
83
+     * @var array
84
+     */
85
+    protected $guarded = array();
86
+
87
+    /**
88
+     * Properties which should not be serialized.
89
+     *
90
+     * @var array
91
+     */
92
+    protected $hidden = array();
93
+
94
+    /**
95
+     * Properties which should be serialized.
96
+     *
97
+     * @var array
98
+     */
99
+    protected $visible = array();
100
+
101
+    /**
102
+     * Whether the model's properties are guarded.
103
+     *
104
+     * When false, allows guarded properties to be filled.
105
+     *
106
+     * @var bool
107
+     */
108
+    protected $is_guarded = true;
109
+
110
+    /**
111
+     * Constructs a new model with provided attributes.
112
+     *
113
+     * If self::OBJECT_KEY is passed as one of the attributes, the underlying post
114
+     * will be overwritten.
115
+     *
116
+     * @param array <string, mixed> $attributes
117
+     */
118
+    public function __construct( array $attributes = array() ) {
119
+        $this->maybe_boot();
120
+        $this->sync_original();
121
+
122
+        if ( $this->uses_wp_object() ) {
123
+            $this->create_wp_object();
124
+        }
125
+
126
+        $this->unguard();
127
+        $this->refresh( $attributes );
128
+        $this->reguard();
129
+    }
130
+
131
+    /**
132
+     * Refreshes the model's current attributes with the provided array.
133
+     *
134
+     * The model's attributes will match what was provided in the array,
135
+     * and any attributes not passed
136
+     *
137
+     * @param array $attributes
138
+     *
139
+     * @return $this
140
+     */
141
+    public function refresh( array $attributes ) {
142
+        $this->clear();
143
+
144
+        return $this->merge( $attributes );
145
+    }
146
+
147
+    /**
148
+     * Merges the provided attributes with the provided array.
149
+     *
150
+     * @param array $attributes
151
+     *
152
+     * @return $this
153
+     */
154
+    public function merge( array $attributes ) {
155
+        foreach ( $attributes as $name => $value ) {
156
+            $this->set_attribute( $name, $value );
157
+        }
158
+
159
+        return $this;
160
+    }
161
+
162
+    /**
163
+     * Get the model's table attributes.
164
+     *
165
+     * Returns the array of for the model that will either need to be
166
+     * saved in postmeta or a separate table.
167
+     *
168
+     * @return array
169
+     */
170
+    public function get_table_attributes() {
171
+        return $this->attributes[ self::TABLE_KEY ];
172
+    }
173
+
174
+    /**
175
+     * Get the model's original attributes.
176
+     *
177
+     * @return array
178
+     */
179
+    public function get_original_table_attributes() {
180
+        return $this->original[ self::TABLE_KEY ];
181
+    }
182
+
183
+    /**
184
+     * Retrieve an array of the attributes on the model
185
+     * that have changed compared to the model's
186
+     * original data.
187
+     *
188
+     * @return array
189
+     */
190
+    public function get_changed_table_attributes() {
191
+        $changed = array();
192
+
193
+        foreach ( $this->get_table_attributes() as $key => $value ) {
194
+            if ( $value !==
195
+                    $this->get_original_attribute( $key )
196
+            ) {
197
+                $changed[ $key ] = $value;
198
+            }
199
+        }
200
+
201
+        return $changed;
202
+    }
203
+
204
+    /**
205
+     * Get the model's underlying post.
206
+     *
207
+     * Returns the underlying WP_Post object for the model, representing
208
+     * the data that will be save in the wp_posts table.
209
+     *
210
+     * @return false|WP_Post|WP_Term
211
+     */
212
+    public function get_underlying_wp_object() {
213
+        if ( isset( $this->attributes[ self::OBJECT_KEY ] ) ) {
214
+            return $this->attributes[ self::OBJECT_KEY ];
215
+        }
216
+
217
+        return false;
218
+    }
219
+
220
+    /**
221
+     * Get the model's original underlying post.
222
+     *
223
+     * @return WP_Post
224
+     */
225
+    public function get_original_underlying_wp_object() {
226
+        return $this->original[ self::OBJECT_KEY ];
227
+    }
228
+
229
+    /**
230
+     * Get the model attributes on the WordPress object
231
+     * that have changed compared to the model's
232
+     * original attributes.
233
+     *
234
+     * @return array
235
+     */
236
+    public function get_changed_wp_object_attributes() {
237
+        $changed = array();
238
+
239
+        foreach ( $this->get_wp_object_keys() as $key ) {
240
+            if ( $this->get_attribute( $key ) !==
241
+                    $this->get_original_attribute( $key )
242
+            ) {
243
+                $changed[ $key ] = $this->get_attribute( $key );
244
+            }
245
+        }
246
+
247
+        return $changed;
248
+    }
249
+
250
+    /**
251
+     * Magic __set method.
252
+     *
253
+     * Passes the name and value to set_attribute, which is where the magic happens.
254
+     *
255
+     * @param string $name
256
+     * @param mixed  $value
257
+     */
258
+    public function __set( $name, $value ) {
259
+        $this->set_attribute( $name, $value );
260
+    }
261
+
262
+    /**
263
+     * Sets the model attributes.
264
+     *
265
+     * Checks whether the model attribute can be set, check if it
266
+     * maps to the WP_Post property, otherwise, assigns it to the
267
+     * table attribute array.
268
+     *
269
+     * @param string $name
270
+     * @param mixed  $value
271
+     *
272
+     * @return $this
273
+     *
274
+     * @throws GuardedPropertyException
275
+     */
276
+    public function set_attribute( $name, $value ) {
277
+        if ( self::OBJECT_KEY === $name ) {
278
+            return $this->override_wp_object( $value );
279
+        }
280
+
281
+        if ( self::TABLE_KEY === $name ) {
282
+            return $this->override_table( $value );
283
+        }
284
+
285
+        if ( ! $this->is_fillable( $name ) ) {
286
+            throw new GuardedPropertyException;
287
+        }
288
+
289
+        if ( $method = $this->has_map_method( $name ) ) {
290
+            $this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()} = $value;
291
+        } else {
292
+            $this->attributes[ self::TABLE_KEY ][ $name ] = $value;
293
+        }
294
+
295
+        return $this;
296
+    }
297
+
298
+    /**
299
+     * Retrieves all the attribute keys for the model.
300
+     *
301
+     * @return array
302
+     */
303
+    public function get_attribute_keys() {
304
+        if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
305
+            return self::$memo[ get_called_class() ][ __METHOD__ ];
306
+        }
307
+
308
+        return self::$memo[ get_called_class() ][ __METHOD__ ]
309
+            = array_merge(
310
+                $this->fillable,
311
+                $this->guarded,
312
+                $this->get_compute_methods()
313
+            );
314
+    }
315
+
316
+    /**
317
+     * Retrieves the attribute keys that aren't mapped to a post.
318
+     *
319
+     * @return array
320
+     */
321
+    public function get_table_keys() {
322
+        if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
323
+            return self::$memo[ get_called_class() ][ __METHOD__ ];
324
+        }
325
+
326
+        $keys = array();
327
+
328
+        foreach ( $this->get_attribute_keys() as $key ) {
329
+            if ( ! $this->has_map_method( $key ) &&
330
+                 ! $this->has_compute_method( $key )
331
+            ) {
332
+                $keys[] = $key;
333
+            }
334
+        }
335
+
336
+        return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
337
+    }
338
+
339
+    /**
340
+     * Retrieves the attribute keys that are mapped to a post.
341
+     *
342
+     * @return array
343
+     */
344
+    public function get_wp_object_keys() {
345
+        if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
346
+            return self::$memo[ get_called_class() ][ __METHOD__ ];
347
+        }
348
+
349
+        $keys = array();
350
+
351
+        foreach ( $this->get_attribute_keys() as $key ) {
352
+            if ( $this->has_map_method( $key ) ) {
353
+                $keys[] = $key;
354
+            }
355
+        }
356
+
357
+        return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
358
+    }
359
+
360
+    /**
361
+     * Returns the model's keys that are computed at call time.
362
+     *
363
+     * @return array
364
+     */
365
+    public function get_computed_keys() {
366
+        if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
367
+            return self::$memo[ get_called_class() ][ __METHOD__ ];
368
+        }
369
+
370
+        $keys = array();
371
+
372
+        foreach ( $this->get_attribute_keys() as $key ) {
373
+            if ( $this->has_compute_method( $key ) ) {
374
+                $keys[] = $key;
375
+            }
376
+        }
377
+
378
+        return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
379
+    }
380
+
381
+    /**
382
+     * Serializes the model's public data into an array.
383
+     *
384
+     * @return array
385
+     */
386
+    public function serialize() {
387
+        $attributes = array();
388
+
389
+        if ( $this->visible ) {
390
+            // If visible attributes are set, we'll only reveal those.
391
+            foreach ( $this->visible as $key ) {
392
+                $attributes[ $key ] = $this->get_attribute( $key );
393
+            }
394
+        } elseif ( $this->hidden ) {
395
+            // If hidden attributes are set, we'll grab everything and hide those.
396
+            foreach ( $this->get_attribute_keys() as $key ) {
397
+                if ( ! in_array( $key, $this->hidden ) ) {
398
+                    $attributes[ $key ] = $this->get_attribute( $key );
399
+                }
400
+            }
401
+        } else {
402
+            // If nothing is hidden/visible, we'll grab and reveal everything.
403
+            foreach ( $this->get_attribute_keys() as $key ) {
404
+                $attributes[ $key ] = $this->get_attribute( $key );
405
+            }
406
+        }
407
+
408
+        return array_map( function ( $attribute ) {
409
+            if ( $attribute instanceof Serializes ) {
410
+                return $attribute->serialize();
411
+            }
412
+
413
+            return $attribute;
414
+        }, $attributes );
415
+    }
416
+
417
+    /**
418
+     * Syncs the current attributes to the model's original.
419
+     *
420
+     * @return $this
421
+     */
422
+    public function sync_original() {
423
+        $this->original = $this->attributes;
424
+
425
+        if ( $this->attributes[ self::OBJECT_KEY ] ) {
426
+            $this->original[ self::OBJECT_KEY ] = clone $this->attributes[ self::OBJECT_KEY ];
427
+        }
428
+
429
+        foreach ( $this->original[ self::TABLE_KEY ] as $key => $item ) {
430
+            if ( is_object( $item ) ) {
431
+                $this->original[ $key ] = clone $item;
432
+            }
433
+        }
434
+
435
+        return $this;
436
+    }
437
+
438
+    /**
439
+     * Checks if a given attribute is mass-fillable.
440
+     *
441
+     * Returns true if the attribute can be filled, false if it can't.
442
+     *
443
+     * @param string $name
444
+     *
445
+     * @return bool
446
+     */
447
+    private function is_fillable( $name ) {
448
+        // If this model isn't guarded, everything is fillable.
449
+        if ( ! $this->is_guarded ) {
450
+            return true;
451
+        }
452
+
453
+        // If it's in the fillable array, then it's fillable.
454
+        if ( in_array( $name, $this->fillable ) ) {
455
+            return true;
456
+        }
457
+
458
+        // If it's explicitly guarded, then it's not fillable.
459
+        if ( in_array( $name, $this->guarded ) ) {
460
+            return false;
461
+        }
462
+
463
+        // If fillable hasn't been defined, then everything else fillable.
464
+        return ! $this->fillable;
465
+    }
466
+
467
+    /**
468
+     * Overrides the current WordPress object with a provided one.
469
+     *
470
+     * Resets the post's default values and stores it in the attributes.
471
+     *
472
+     * @param WP_Post|WP_Term|null $value
473
+     *
474
+     * @return $this
475
+     */
476
+    private function override_wp_object( $value ) {
477
+        if ( is_object( $value ) ) {
478
+            $this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $value );
479
+        } else {
480
+            $this->attributes[ self::OBJECT_KEY ] = null;
481
+
482
+            if ( $this->uses_wp_object() ) {
483
+                $this->create_wp_object();
484
+            }
485
+        }
486
+
487
+        return $this;
488
+    }
489
+
490
+    /**
491
+     * Overrides the current table attributes array with a provided one.
492
+     *
493
+     * @param array $value
494
+     *
495
+     * @return $this
496
+     */
497
+    private function override_table( array $value ) {
498
+        $this->attributes[ self::TABLE_KEY ] = $value;
499
+
500
+        return $this;
501
+    }
502
+
503
+    /**
504
+     * Create and set with a new blank post.
505
+     *
506
+     * Creates a new WP_Post object, assigns it the default attributes,
507
+     * and stores it in the attributes.
508
+     *
509
+     * @throws LogicException
510
+     */
511
+    private function create_wp_object() {
512
+        switch ( true ) {
513
+            case $this instanceof UsesWordPressPost:
514
+                $object = new WP_Post( (object) array() );
515
+                break;
516
+            case $this instanceof UsesWordPressTerm:
517
+                $object = new WP_Term( (object) array() );
518
+                break;
519
+            default:
520
+                throw new LogicException;
521
+                break;
522
+        }
523
+
524
+        $this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $object );
525
+    }
526
+
527
+    /**
528
+     * Enforces values on the post that can't change.
529
+     *
530
+     * Primarily, this is used to make sure the post_type always maps
531
+     * to the model's "$type" property, but this can all be overridden
532
+     * by the developer to enforce other values in the model.
533
+     *
534
+     * @param object $object
535
+     *
536
+     * @return object
537
+     */
538
+    protected function set_wp_object_constants( $object ) {
539
+        if ( $this instanceof UsesWordPressPost ) {
540
+            $object->post_type = static::get_post_type();
541
+        }
542
+
543
+        if ( $this instanceof UsesWordPressTerm ) {
544
+            $object->taxonomy = static::get_taxonomy();
545
+        }
546
+
547
+        return $object;
548
+    }
549
+
550
+    /**
551
+     * Magic __get method.
552
+     *
553
+     * Passes the name and value to get_attribute, which is where the magic happens.
554
+     *
555
+     * @param string $name
556
+     *
557
+     * @return mixed
558
+     */
559
+    public function __get( $name ) {
560
+        return $this->get_attribute( $name );
561
+    }
562
+
563
+    /**
564
+     * Retrieves the model attribute.
565
+     *
566
+     * @param string $name
567
+     *
568
+     * @return mixed
569
+     *
570
+     * @throws PropertyDoesNotExistException If property isn't found.
571
+     */
572
+    public function get_attribute( $name ) {
573
+        if ( $method = $this->has_map_method( $name ) ) {
574
+            return $this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()};
575
+        }
576
+
577
+        if ( $method = $this->has_compute_method( $name ) ) {
578
+            return $this->{$method}();
579
+        }
580
+
581
+        if ( isset( $this->attributes[ self::TABLE_KEY ][ $name ] ) ) {
582
+            return $this->attributes[ self::TABLE_KEY ][ $name ];
583
+        }
584
+
585
+        if ( isset( $this->defaults[ $name ] ) ) {
586
+            return $this->defaults[ $name ];
587
+        }
588
+
589
+        return null;
590
+    }
591
+
592
+    /**
593
+     * Retrieve the model's original attribute value.
594
+     *
595
+     * @param string $name
596
+     *
597
+     * @return mixed
598
+     *
599
+     * @throws PropertyDoesNotExistException If property isn't found.
600
+     */
601
+    public function get_original_attribute( $name ) {
602
+        $original_attributes = $this->original;
603
+
604
+        if ( ! is_object( $original_attributes[ static::OBJECT_KEY ] ) ) {
605
+            unset( $original_attributes[ static::OBJECT_KEY ] );
606
+        }
607
+
608
+        $original = new static( $original_attributes );
609
+
610
+        return $original->get_attribute( $name );
611
+    }
612
+
613
+    /**
614
+     * Fetches the Model's primary ID, depending on the model
615
+     * implementation.
616
+     *
617
+     * @return int
618
+     *
619
+     * @throws LogicException
620
+     */
621
+    public function get_primary_id() {
622
+        if ( $this instanceof UsesWordPressPost ) {
623
+            return $this->get_underlying_wp_object()->ID;
624
+        }
625
+
626
+        if ( $this instanceof UsesWordPressTerm ) {
627
+            return $this->get_underlying_wp_object()->term_id;
628
+        }
629
+
630
+        if ( $this instanceof UsesCustomTable ) {
631
+            return $this->get_attribute( $this->get_primary_key() );
632
+        }
633
+
634
+        // Model w/o wp_object not yet supported.
635
+        throw new LogicException;
636
+    }
637
+
638
+    /**
639
+     * Checks whether the attribute has a map method.
640
+     *
641
+     * This is used to determine whether the attribute maps to a
642
+     * property on the underlying WP_Post object. Returns the
643
+     * method if one exists, returns false if it doesn't.
644
+     *
645
+     * @param string $name
646
+     *
647
+     * @return false|string
648
+     */
649
+    protected function has_map_method( $name ) {
650
+        if ( method_exists( $this, $method = "map_{$name}" ) ) {
651
+            return $method;
652
+        }
653
+
654
+        return false;
655
+    }
656
+
657
+    /**
658
+     * Checks whether the attribute has a compute method.
659
+     *
660
+     * This is used to determine if the attribute should be computed
661
+     * from other attributes.
662
+     *
663
+     * @param string $name
664
+     *
665
+     * @return false|string
666
+     */
667
+    protected function has_compute_method( $name ) {
668
+        if ( method_exists( $this, $method = "compute_{$name}" ) ) {
669
+            return $method;
670
+        }
671
+
672
+        return false;
673
+    }
674
+
675
+    /**
676
+     * Clears all the current attributes from the model.
677
+     *
678
+     * This does not touch the model's original attributes, and will
679
+     * only clear fillable attributes, unless the model is unguarded.
680
+     *
681
+     * @return $this
682
+     */
683
+    public function clear() {
684
+        $keys = array_merge(
685
+            $this->get_table_keys(),
686
+            $this->get_wp_object_keys()
687
+        );
688
+
689
+        foreach ( $keys as $key ) {
690
+            try {
691
+                $this->set_attribute( $key, null );
692
+            } catch ( GuardedPropertyException $e ) {
693
+                // We won't clear out guarded attributes.
694
+            }
695
+        }
696
+
697
+        return $this;
698
+    }
699
+
700
+    /**
701
+     * Unguards the model.
702
+     *
703
+     * Sets the model to be unguarded, allowing the filling of
704
+     * guarded attributes.
705
+     */
706
+    public function unguard() {
707
+        $this->is_guarded = false;
708
+    }
709
+
710
+    /**
711
+     * Reguards the model.
712
+     *
713
+     * Sets the model to be guarded, preventing filling of
714
+     * guarded attributes.
715
+     */
716
+    public function reguard() {
717
+        $this->is_guarded = true;
718
+    }
719
+
720
+    /**
721
+     * Retrieves all the compute methods on the model.
722
+     *
723
+     * @return array
724
+     */
725
+    protected function get_compute_methods() {
726
+        $methods = get_class_methods( get_called_class() );
727
+        $methods = array_filter( $methods, function ( $method ) {
728
+            return strrpos( $method, 'compute_', - strlen( $method ) ) !== false;
729
+        } );
730
+        $methods = array_map( function ( $method ) {
731
+            return substr( $method, strlen( 'compute_' ) );
732
+        }, $methods );
733
+
734
+        return $methods;
735
+    }
736
+
737
+    /**
738
+     * Sets up the memo array for the creating model.
739
+     */
740
+    private function maybe_boot() {
741
+        if ( ! isset( self::$memo[ get_called_class() ] ) ) {
742
+            self::$memo[ get_called_class() ] = array();
743
+        }
744
+    }
745
+
746
+    /**
747
+     * Whether this Model uses an underlying WordPress object.
748
+     *
749
+     * @return bool
750
+     */
751
+    protected function uses_wp_object() {
752
+        return $this instanceof UsesWordPressPost ||
753
+            $this instanceof UsesWordPressTerm;
754
+    }
755 755
 }
Please login to merge, or discard this patch.
Spacing   +121 added lines, -121 removed lines patch added patch discarded remove patch
@@ -115,16 +115,16 @@  discard block
 block discarded – undo
115 115
 	 *
116 116
 	 * @param array <string, mixed> $attributes
117 117
 	 */
118
-	public function __construct( array $attributes = array() ) {
118
+	public function __construct(array $attributes = array()) {
119 119
 		$this->maybe_boot();
120 120
 		$this->sync_original();
121 121
 
122
-		if ( $this->uses_wp_object() ) {
122
+		if ($this->uses_wp_object()) {
123 123
 			$this->create_wp_object();
124 124
 		}
125 125
 
126 126
 		$this->unguard();
127
-		$this->refresh( $attributes );
127
+		$this->refresh($attributes);
128 128
 		$this->reguard();
129 129
 	}
130 130
 
@@ -138,10 +138,10 @@  discard block
 block discarded – undo
138 138
 	 *
139 139
 	 * @return $this
140 140
 	 */
141
-	public function refresh( array $attributes ) {
141
+	public function refresh(array $attributes) {
142 142
 		$this->clear();
143 143
 
144
-		return $this->merge( $attributes );
144
+		return $this->merge($attributes);
145 145
 	}
146 146
 
147 147
 	/**
@@ -151,9 +151,9 @@  discard block
 block discarded – undo
151 151
 	 *
152 152
 	 * @return $this
153 153
 	 */
154
-	public function merge( array $attributes ) {
155
-		foreach ( $attributes as $name => $value ) {
156
-			$this->set_attribute( $name, $value );
154
+	public function merge(array $attributes) {
155
+		foreach ($attributes as $name => $value) {
156
+			$this->set_attribute($name, $value);
157 157
 		}
158 158
 
159 159
 		return $this;
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
 	 * @return array
169 169
 	 */
170 170
 	public function get_table_attributes() {
171
-		return $this->attributes[ self::TABLE_KEY ];
171
+		return $this->attributes[self::TABLE_KEY];
172 172
 	}
173 173
 
174 174
 	/**
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
 	 * @return array
178 178
 	 */
179 179
 	public function get_original_table_attributes() {
180
-		return $this->original[ self::TABLE_KEY ];
180
+		return $this->original[self::TABLE_KEY];
181 181
 	}
182 182
 
183 183
 	/**
@@ -190,11 +190,11 @@  discard block
 block discarded – undo
190 190
 	public function get_changed_table_attributes() {
191 191
 		$changed = array();
192 192
 
193
-		foreach ( $this->get_table_attributes() as $key => $value ) {
194
-			if ( $value !==
195
-				 $this->get_original_attribute( $key )
193
+		foreach ($this->get_table_attributes() as $key => $value) {
194
+			if ($value !==
195
+				 $this->get_original_attribute($key)
196 196
 			) {
197
-				$changed[ $key ] = $value;
197
+				$changed[$key] = $value;
198 198
 			}
199 199
 		}
200 200
 
@@ -210,8 +210,8 @@  discard block
 block discarded – undo
210 210
 	 * @return false|WP_Post|WP_Term
211 211
 	 */
212 212
 	public function get_underlying_wp_object() {
213
-		if ( isset( $this->attributes[ self::OBJECT_KEY ] ) ) {
214
-			return $this->attributes[ self::OBJECT_KEY ];
213
+		if (isset($this->attributes[self::OBJECT_KEY])) {
214
+			return $this->attributes[self::OBJECT_KEY];
215 215
 		}
216 216
 
217 217
 		return false;
@@ -223,7 +223,7 @@  discard block
 block discarded – undo
223 223
 	 * @return WP_Post
224 224
 	 */
225 225
 	public function get_original_underlying_wp_object() {
226
-		return $this->original[ self::OBJECT_KEY ];
226
+		return $this->original[self::OBJECT_KEY];
227 227
 	}
228 228
 
229 229
 	/**
@@ -236,11 +236,11 @@  discard block
 block discarded – undo
236 236
 	public function get_changed_wp_object_attributes() {
237 237
 		$changed = array();
238 238
 
239
-		foreach ( $this->get_wp_object_keys() as $key ) {
240
-			if ( $this->get_attribute( $key ) !==
241
-				 $this->get_original_attribute( $key )
239
+		foreach ($this->get_wp_object_keys() as $key) {
240
+			if ($this->get_attribute($key) !==
241
+				 $this->get_original_attribute($key)
242 242
 			) {
243
-				$changed[ $key ] = $this->get_attribute( $key );
243
+				$changed[$key] = $this->get_attribute($key);
244 244
 			}
245 245
 		}
246 246
 
@@ -255,8 +255,8 @@  discard block
 block discarded – undo
255 255
 	 * @param string $name
256 256
 	 * @param mixed  $value
257 257
 	 */
258
-	public function __set( $name, $value ) {
259
-		$this->set_attribute( $name, $value );
258
+	public function __set($name, $value) {
259
+		$this->set_attribute($name, $value);
260 260
 	}
261 261
 
262 262
 	/**
@@ -273,23 +273,23 @@  discard block
 block discarded – undo
273 273
 	 *
274 274
 	 * @throws GuardedPropertyException
275 275
 	 */
276
-	public function set_attribute( $name, $value ) {
277
-		if ( self::OBJECT_KEY === $name ) {
278
-			return $this->override_wp_object( $value );
276
+	public function set_attribute($name, $value) {
277
+		if (self::OBJECT_KEY === $name) {
278
+			return $this->override_wp_object($value);
279 279
 		}
280 280
 
281
-		if ( self::TABLE_KEY === $name ) {
282
-			return $this->override_table( $value );
281
+		if (self::TABLE_KEY === $name) {
282
+			return $this->override_table($value);
283 283
 		}
284 284
 
285
-		if ( ! $this->is_fillable( $name ) ) {
285
+		if (!$this->is_fillable($name)) {
286 286
 			throw new GuardedPropertyException;
287 287
 		}
288 288
 
289
-		if ( $method = $this->has_map_method( $name ) ) {
290
-			$this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()} = $value;
289
+		if ($method = $this->has_map_method($name)) {
290
+			$this->attributes[self::OBJECT_KEY]->{$this->{$method}()} = $value;
291 291
 		} else {
292
-			$this->attributes[ self::TABLE_KEY ][ $name ] = $value;
292
+			$this->attributes[self::TABLE_KEY][$name] = $value;
293 293
 		}
294 294
 
295 295
 		return $this;
@@ -301,11 +301,11 @@  discard block
 block discarded – undo
301 301
 	 * @return array
302 302
 	 */
303 303
 	public function get_attribute_keys() {
304
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
305
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
304
+		if (isset(self::$memo[get_called_class()][__METHOD__])) {
305
+			return self::$memo[get_called_class()][__METHOD__];
306 306
 		}
307 307
 
308
-		return self::$memo[ get_called_class() ][ __METHOD__ ]
308
+		return self::$memo[get_called_class()][__METHOD__]
309 309
 			= array_merge(
310 310
 				$this->fillable,
311 311
 				$this->guarded,
@@ -319,21 +319,21 @@  discard block
 block discarded – undo
319 319
 	 * @return array
320 320
 	 */
321 321
 	public function get_table_keys() {
322
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
323
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
322
+		if (isset(self::$memo[get_called_class()][__METHOD__])) {
323
+			return self::$memo[get_called_class()][__METHOD__];
324 324
 		}
325 325
 
326 326
 		$keys = array();
327 327
 
328
-		foreach ( $this->get_attribute_keys() as $key ) {
329
-			if ( ! $this->has_map_method( $key ) &&
330
-				 ! $this->has_compute_method( $key )
328
+		foreach ($this->get_attribute_keys() as $key) {
329
+			if (!$this->has_map_method($key) &&
330
+				 !$this->has_compute_method($key)
331 331
 			) {
332 332
 				$keys[] = $key;
333 333
 			}
334 334
 		}
335 335
 
336
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
336
+		return self::$memo[get_called_class()][__METHOD__] = $keys;
337 337
 	}
338 338
 
339 339
 	/**
@@ -342,19 +342,19 @@  discard block
 block discarded – undo
342 342
 	 * @return array
343 343
 	 */
344 344
 	public function get_wp_object_keys() {
345
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
346
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
345
+		if (isset(self::$memo[get_called_class()][__METHOD__])) {
346
+			return self::$memo[get_called_class()][__METHOD__];
347 347
 		}
348 348
 
349 349
 		$keys = array();
350 350
 
351
-		foreach ( $this->get_attribute_keys() as $key ) {
352
-			if ( $this->has_map_method( $key ) ) {
351
+		foreach ($this->get_attribute_keys() as $key) {
352
+			if ($this->has_map_method($key)) {
353 353
 				$keys[] = $key;
354 354
 			}
355 355
 		}
356 356
 
357
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
357
+		return self::$memo[get_called_class()][__METHOD__] = $keys;
358 358
 	}
359 359
 
360 360
 	/**
@@ -363,19 +363,19 @@  discard block
 block discarded – undo
363 363
 	 * @return array
364 364
 	 */
365 365
 	public function get_computed_keys() {
366
-		if ( isset( self::$memo[ get_called_class() ][ __METHOD__ ] ) ) {
367
-			return self::$memo[ get_called_class() ][ __METHOD__ ];
366
+		if (isset(self::$memo[get_called_class()][__METHOD__])) {
367
+			return self::$memo[get_called_class()][__METHOD__];
368 368
 		}
369 369
 
370 370
 		$keys = array();
371 371
 
372
-		foreach ( $this->get_attribute_keys() as $key ) {
373
-			if ( $this->has_compute_method( $key ) ) {
372
+		foreach ($this->get_attribute_keys() as $key) {
373
+			if ($this->has_compute_method($key)) {
374 374
 				$keys[] = $key;
375 375
 			}
376 376
 		}
377 377
 
378
-		return self::$memo[ get_called_class() ][ __METHOD__ ] = $keys;
378
+		return self::$memo[get_called_class()][__METHOD__] = $keys;
379 379
 	}
380 380
 
381 381
 	/**
@@ -386,32 +386,32 @@  discard block
 block discarded – undo
386 386
 	public function serialize() {
387 387
 		$attributes = array();
388 388
 
389
-		if ( $this->visible ) {
389
+		if ($this->visible) {
390 390
 			// If visible attributes are set, we'll only reveal those.
391
-			foreach ( $this->visible as $key ) {
392
-				$attributes[ $key ] = $this->get_attribute( $key );
391
+			foreach ($this->visible as $key) {
392
+				$attributes[$key] = $this->get_attribute($key);
393 393
 			}
394
-		} elseif ( $this->hidden ) {
394
+		} elseif ($this->hidden) {
395 395
 			// If hidden attributes are set, we'll grab everything and hide those.
396
-			foreach ( $this->get_attribute_keys() as $key ) {
397
-				if ( ! in_array( $key, $this->hidden ) ) {
398
-					$attributes[ $key ] = $this->get_attribute( $key );
396
+			foreach ($this->get_attribute_keys() as $key) {
397
+				if (!in_array($key, $this->hidden)) {
398
+					$attributes[$key] = $this->get_attribute($key);
399 399
 				}
400 400
 			}
401 401
 		} else {
402 402
 			// If nothing is hidden/visible, we'll grab and reveal everything.
403
-			foreach ( $this->get_attribute_keys() as $key ) {
404
-				$attributes[ $key ] = $this->get_attribute( $key );
403
+			foreach ($this->get_attribute_keys() as $key) {
404
+				$attributes[$key] = $this->get_attribute($key);
405 405
 			}
406 406
 		}
407 407
 
408
-		return array_map( function ( $attribute ) {
409
-			if ( $attribute instanceof Serializes ) {
408
+		return array_map(function($attribute) {
409
+			if ($attribute instanceof Serializes) {
410 410
 				return $attribute->serialize();
411 411
 			}
412 412
 
413 413
 			return $attribute;
414
-		}, $attributes );
414
+		}, $attributes);
415 415
 	}
416 416
 
417 417
 	/**
@@ -422,13 +422,13 @@  discard block
 block discarded – undo
422 422
 	public function sync_original() {
423 423
 		$this->original = $this->attributes;
424 424
 
425
-		if ( $this->attributes[ self::OBJECT_KEY ] ) {
426
-			$this->original[ self::OBJECT_KEY ] = clone $this->attributes[ self::OBJECT_KEY ];
425
+		if ($this->attributes[self::OBJECT_KEY]) {
426
+			$this->original[self::OBJECT_KEY] = clone $this->attributes[self::OBJECT_KEY];
427 427
 		}
428 428
 
429
-		foreach ( $this->original[ self::TABLE_KEY ] as $key => $item ) {
430
-			if ( is_object( $item ) ) {
431
-				$this->original[ $key ] = clone $item;
429
+		foreach ($this->original[self::TABLE_KEY] as $key => $item) {
430
+			if (is_object($item)) {
431
+				$this->original[$key] = clone $item;
432 432
 			}
433 433
 		}
434 434
 
@@ -444,24 +444,24 @@  discard block
 block discarded – undo
444 444
 	 *
445 445
 	 * @return bool
446 446
 	 */
447
-	private function is_fillable( $name ) {
447
+	private function is_fillable($name) {
448 448
 		// If this model isn't guarded, everything is fillable.
449
-		if ( ! $this->is_guarded ) {
449
+		if (!$this->is_guarded) {
450 450
 			return true;
451 451
 		}
452 452
 
453 453
 		// If it's in the fillable array, then it's fillable.
454
-		if ( in_array( $name, $this->fillable ) ) {
454
+		if (in_array($name, $this->fillable)) {
455 455
 			return true;
456 456
 		}
457 457
 
458 458
 		// If it's explicitly guarded, then it's not fillable.
459
-		if ( in_array( $name, $this->guarded ) ) {
459
+		if (in_array($name, $this->guarded)) {
460 460
 			return false;
461 461
 		}
462 462
 
463 463
 		// If fillable hasn't been defined, then everything else fillable.
464
-		return ! $this->fillable;
464
+		return !$this->fillable;
465 465
 	}
466 466
 
467 467
 	/**
@@ -473,13 +473,13 @@  discard block
 block discarded – undo
473 473
 	 *
474 474
 	 * @return $this
475 475
 	 */
476
-	private function override_wp_object( $value ) {
477
-		if ( is_object( $value ) ) {
478
-			$this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $value );
476
+	private function override_wp_object($value) {
477
+		if (is_object($value)) {
478
+			$this->attributes[self::OBJECT_KEY] = $this->set_wp_object_constants($value);
479 479
 		} else {
480
-			$this->attributes[ self::OBJECT_KEY ] = null;
480
+			$this->attributes[self::OBJECT_KEY] = null;
481 481
 
482
-			if ( $this->uses_wp_object() ) {
482
+			if ($this->uses_wp_object()) {
483 483
 				$this->create_wp_object();
484 484
 			}
485 485
 		}
@@ -494,8 +494,8 @@  discard block
 block discarded – undo
494 494
 	 *
495 495
 	 * @return $this
496 496
 	 */
497
-	private function override_table( array $value ) {
498
-		$this->attributes[ self::TABLE_KEY ] = $value;
497
+	private function override_table(array $value) {
498
+		$this->attributes[self::TABLE_KEY] = $value;
499 499
 
500 500
 		return $this;
501 501
 	}
@@ -509,19 +509,19 @@  discard block
 block discarded – undo
509 509
 	 * @throws LogicException
510 510
 	 */
511 511
 	private function create_wp_object() {
512
-		switch ( true ) {
512
+		switch (true) {
513 513
 			case $this instanceof UsesWordPressPost:
514
-				$object = new WP_Post( (object) array() );
514
+				$object = new WP_Post((object) array());
515 515
 				break;
516 516
 			case $this instanceof UsesWordPressTerm:
517
-				$object = new WP_Term( (object) array() );
517
+				$object = new WP_Term((object) array());
518 518
 				break;
519 519
 			default:
520 520
 				throw new LogicException;
521 521
 				break;
522 522
 		}
523 523
 
524
-		$this->attributes[ self::OBJECT_KEY ] = $this->set_wp_object_constants( $object );
524
+		$this->attributes[self::OBJECT_KEY] = $this->set_wp_object_constants($object);
525 525
 	}
526 526
 
527 527
 	/**
@@ -535,12 +535,12 @@  discard block
 block discarded – undo
535 535
 	 *
536 536
 	 * @return object
537 537
 	 */
538
-	protected function set_wp_object_constants( $object ) {
539
-		if ( $this instanceof UsesWordPressPost ) {
538
+	protected function set_wp_object_constants($object) {
539
+		if ($this instanceof UsesWordPressPost) {
540 540
 			$object->post_type = static::get_post_type();
541 541
 		}
542 542
 
543
-		if ( $this instanceof UsesWordPressTerm ) {
543
+		if ($this instanceof UsesWordPressTerm) {
544 544
 			$object->taxonomy = static::get_taxonomy();
545 545
 		}
546 546
 
@@ -556,8 +556,8 @@  discard block
 block discarded – undo
556 556
 	 *
557 557
 	 * @return mixed
558 558
 	 */
559
-	public function __get( $name ) {
560
-		return $this->get_attribute( $name );
559
+	public function __get($name) {
560
+		return $this->get_attribute($name);
561 561
 	}
562 562
 
563 563
 	/**
@@ -569,21 +569,21 @@  discard block
 block discarded – undo
569 569
 	 *
570 570
 	 * @throws PropertyDoesNotExistException If property isn't found.
571 571
 	 */
572
-	public function get_attribute( $name ) {
573
-		if ( $method = $this->has_map_method( $name ) ) {
574
-			return $this->attributes[ self::OBJECT_KEY ]->{$this->{$method}()};
572
+	public function get_attribute($name) {
573
+		if ($method = $this->has_map_method($name)) {
574
+			return $this->attributes[self::OBJECT_KEY]->{$this->{$method}()};
575 575
 		}
576 576
 
577
-		if ( $method = $this->has_compute_method( $name ) ) {
577
+		if ($method = $this->has_compute_method($name)) {
578 578
 			return $this->{$method}();
579 579
 		}
580 580
 
581
-		if ( isset( $this->attributes[ self::TABLE_KEY ][ $name ] ) ) {
582
-			return $this->attributes[ self::TABLE_KEY ][ $name ];
581
+		if (isset($this->attributes[self::TABLE_KEY][$name])) {
582
+			return $this->attributes[self::TABLE_KEY][$name];
583 583
 		}
584 584
 
585
-		if ( isset( $this->defaults[ $name ] ) ) {
586
-			return $this->defaults[ $name ];
585
+		if (isset($this->defaults[$name])) {
586
+			return $this->defaults[$name];
587 587
 		}
588 588
 
589 589
 		return null;
@@ -598,16 +598,16 @@  discard block
 block discarded – undo
598 598
 	 *
599 599
 	 * @throws PropertyDoesNotExistException If property isn't found.
600 600
 	 */
601
-	public function get_original_attribute( $name ) {
601
+	public function get_original_attribute($name) {
602 602
 		$original_attributes = $this->original;
603 603
 
604
-		if ( ! is_object( $original_attributes[ static::OBJECT_KEY ] ) ) {
605
-			unset( $original_attributes[ static::OBJECT_KEY ] );
604
+		if (!is_object($original_attributes[static::OBJECT_KEY])) {
605
+			unset($original_attributes[static::OBJECT_KEY]);
606 606
 		}
607 607
 
608
-		$original = new static( $original_attributes );
608
+		$original = new static($original_attributes);
609 609
 
610
-		return $original->get_attribute( $name );
610
+		return $original->get_attribute($name);
611 611
 	}
612 612
 
613 613
 	/**
@@ -619,16 +619,16 @@  discard block
 block discarded – undo
619 619
 	 * @throws LogicException
620 620
 	 */
621 621
 	public function get_primary_id() {
622
-		if ( $this instanceof UsesWordPressPost ) {
622
+		if ($this instanceof UsesWordPressPost) {
623 623
 			return $this->get_underlying_wp_object()->ID;
624 624
 		}
625 625
 
626
-		if ( $this instanceof UsesWordPressTerm ) {
626
+		if ($this instanceof UsesWordPressTerm) {
627 627
 			return $this->get_underlying_wp_object()->term_id;
628 628
 		}
629 629
 
630
-		if ( $this instanceof UsesCustomTable ) {
631
-			return $this->get_attribute( $this->get_primary_key() );
630
+		if ($this instanceof UsesCustomTable) {
631
+			return $this->get_attribute($this->get_primary_key());
632 632
 		}
633 633
 
634 634
 		// Model w/o wp_object not yet supported.
@@ -646,8 +646,8 @@  discard block
 block discarded – undo
646 646
 	 *
647 647
 	 * @return false|string
648 648
 	 */
649
-	protected function has_map_method( $name ) {
650
-		if ( method_exists( $this, $method = "map_{$name}" ) ) {
649
+	protected function has_map_method($name) {
650
+		if (method_exists($this, $method = "map_{$name}")) {
651 651
 			return $method;
652 652
 		}
653 653
 
@@ -664,8 +664,8 @@  discard block
 block discarded – undo
664 664
 	 *
665 665
 	 * @return false|string
666 666
 	 */
667
-	protected function has_compute_method( $name ) {
668
-		if ( method_exists( $this, $method = "compute_{$name}" ) ) {
667
+	protected function has_compute_method($name) {
668
+		if (method_exists($this, $method = "compute_{$name}")) {
669 669
 			return $method;
670 670
 		}
671 671
 
@@ -686,10 +686,10 @@  discard block
 block discarded – undo
686 686
 			$this->get_wp_object_keys()
687 687
 		);
688 688
 
689
-		foreach ( $keys as $key ) {
689
+		foreach ($keys as $key) {
690 690
 			try {
691
-				$this->set_attribute( $key, null );
692
-			} catch ( GuardedPropertyException $e ) {
691
+				$this->set_attribute($key, null);
692
+			} catch (GuardedPropertyException $e) {
693 693
 				// We won't clear out guarded attributes.
694 694
 			}
695 695
 		}
@@ -723,13 +723,13 @@  discard block
 block discarded – undo
723 723
 	 * @return array
724 724
 	 */
725 725
 	protected function get_compute_methods() {
726
-		$methods = get_class_methods( get_called_class() );
727
-		$methods = array_filter( $methods, function ( $method ) {
728
-			return strrpos( $method, 'compute_', - strlen( $method ) ) !== false;
726
+		$methods = get_class_methods(get_called_class());
727
+		$methods = array_filter($methods, function($method) {
728
+			return strrpos($method, 'compute_', - strlen($method)) !== false;
729 729
 		} );
730
-		$methods = array_map( function ( $method ) {
731
-			return substr( $method, strlen( 'compute_' ) );
732
-		}, $methods );
730
+		$methods = array_map(function($method) {
731
+			return substr($method, strlen('compute_'));
732
+		}, $methods);
733 733
 
734 734
 		return $methods;
735 735
 	}
@@ -738,8 +738,8 @@  discard block
 block discarded – undo
738 738
 	 * Sets up the memo array for the creating model.
739 739
 	 */
740 740
 	private function maybe_boot() {
741
-		if ( ! isset( self::$memo[ get_called_class() ] ) ) {
742
-			self::$memo[ get_called_class() ] = array();
741
+		if (!isset(self::$memo[get_called_class()])) {
742
+			self::$memo[get_called_class()] = array();
743 743
 		}
744 744
 	}
745 745
 
Please login to merge, or discard this patch.