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