Kohana_Jam_Meta::finalize()   F
last analyzed

Complexity

Conditions 23
Paths 3844

Size

Total Lines 100

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 32
CRAP Score 27.232

Importance

Changes 0
Metric Value
dl 0
loc 100
ccs 32
cts 40
cp 0.8
rs 0
c 0
b 0
f 0
cc 23
nc 3844
nop 1
crap 27.232

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php defined('SYSPATH') OR die('No direct script access.');
2
/**
3
 * Jam Meta
4
 *
5
 * Jam_Meta objects act as a registry of information about a particular model.
6
 *
7
 * @package    Jam
8
 * @category   Meta
9
 * @author     Ivan Kerin
10
 * @copyright  (c) 2011-2012 Despark Ltd.
11
 * @license    http://www.opensource.org/licenses/isc-license.txt
12
 */
13
abstract class Kohana_Jam_Meta {
14
15
	/**
16
	 * @var  boolean  If this is FALSE, properties can still be set on the meta object
17
	 */
18
	protected $_initialized = FALSE;
19
20
	/**
21
	 * @var  string  The model this meta object belongs to
22
	 */
23
	protected $_model = NULL;
24
25
	/**
26
	 * @var  string  The database key to use for connection
27
	 */
28
	protected $_db;
29
30
	/**
31
	 * @var  string  The table this model represents, defaults to the model name pluralized
32
	 */
33
	protected $_table = '';
34
35
	/**
36
	 * @var  string  The primary key, defaults to the first Field_Primary found.
37
	 *               This can be referenced in query building as :primary_key
38
	 */
39
	protected $_primary_key = '';
40
41
	/**
42
	 * @var  string  The title key. This can be referenced in query building as :name_key
43
	 */
44
	protected $_name_key = 'name';
45
46
	/**
47
	 * @var  string  The foreign key for use in other tables. This can be referenced in query building as :foreign_key
48
	 */
49
	protected $_foreign_key = '';
50
51
	/**
52
	 * @var string The method needed to get the item
53
	 */
54
	protected $_unique_key = '';
55
56
	/**
57
	 * @var  string  The polymorphic key for the model tree.
58
	 */
59
	protected $_polymorphic_key = NULL;
60
61
	/**
62
	 * @var  array  An array of this model's children
63
	 */
64
	protected $_children = array();
65
66
	/**
67
	 * @var  array  An array of ordering options for SELECTs
68
	 */
69
	protected $_sorting = array();
70
71
	/**
72
	 * @var  array  A map to the models's fields and how to process each column.
73
	 */
74
	protected $_fields = array();
75
76
	/**
77
	 * @var  array  A map to the models's associations and how to process each column.
78
	 */
79
	protected $_associations = array();
80
81
82
	/**
83
	 * The message filename used for validation errors.
84
	 * Defaults to Jam_Meta::$_model
85
	 * @var string
86
	 */
87
	protected $_errors_filename = NULL;
88
89
	/**
90
	 * @var  array  Default data for each field
91
	 */
92
	protected $_defaults = array();
93
94
	/**
95
	 * @var Jam_Event Events attached to this model
96
	 */
97
	protected $_events = array();
98
99
	/**
100
	 * @var  array  Behaviors attached to this model
101
	 */
102
	protected $_behaviors = array();
103
104
	/**
105
	 * @var  string  The parent model of this model
106
	 */
107
	protected $_parent = NULL;
108
109
	protected $_validators = array();
110
111
	protected $_with_options;
112
113
	protected $_collection = NULL;
114
115
	/**
116
	 * The most basic initialization possible
117
	 * @param string $model Model name
118
	 */
119 162
	public function __construct($model)
120
	{
121 162
		$this->_model = $model;
122
123
		// Set up event system
124 162
		$this->_events = new Jam_Event($model);
125 162
	}
126
127
	/**
128
	 * This is called after initialization to
129
	 * finalize any changes to the meta object.
130
	 *
131
	 * @param  string  $model
132
	 */
133 7
	public function finalize($model)
134
	{
135 7
		if ($this->_initialized)
136
			return;
137
138
		// Set the name of a possible behavior class
139 7
		$behavior_class = Jam::behavior_prefix().Jam::capitalize_class_name($model);
140
141
		// See if we have a special behavior class to use
142 7
		if (class_exists($behavior_class))
143
		{
144
			// Load behavior
145
			$behavior = new $behavior_class;
146
147
			if ( ! in_array($behavior, $this->_behaviors))
148
			{
149
				// Add to behaviors
150
				$this->_behaviors[] = $behavior;
151
			}
152
		}
153
154 7
		foreach ($this->_behaviors as $name => $behavior)
155
		{
156 6
			if ( ! $behavior instanceof Jam_Behavior)
157
				throw new Kohana_Exception('Behavior at index [ :key ] is not an instance of Jam_Behavior, :type found.', array(
158
					':type' => is_object($behavior) ? ('instance of '.get_class($behavior)) : gettype($behavior),
159
					':key'   => $name,
160
				));
161
162
			// Initialize behavior
163 6
			$behavior->initialize($this, $name);
0 ignored issues
show
Compatibility introduced by
$this of type object<Kohana_Jam_Meta> is not a sub-type of object<Jam_Meta>. It seems like you assume a child class of the class Kohana_Jam_Meta to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
164
		}
165
166
		// Allow modification of this meta object by the behaviors
167 7
		$this->_events->trigger('meta.before_finalize', $this);
168
169
		// Ensure certain fields are not overridden
170 7
		$this->_model       = $model;
171 7
		$this->_defaults    = array();
172
173 7
		if ( ! $this->_errors_filename)
174
		{
175
			// Default errors filename to the model's name
176 7
			$this->_errors_filename = 'validators/'.$this->_model;
177
		}
178
179
		// Table should be a sensible default
180 7
		if (empty($this->_table))
181
		{
182 6
			$this->_table = Inflector::plural($model);
183
		}
184
185
		// Can we set a sensible foreign key?
186 7
		if (empty($this->_foreign_key))
187
		{
188 6
			$this->_foreign_key = $model.'_id';
189
		}
190
191 7
		if (empty($this->_unique_key) AND method_exists(Jam::class_name($this->_model), 'unique_key'))
192
		{
193
			$this->_unique_key = Jam::class_name($this->_model).'::unique_key';
194
		}
195
196 7
		foreach ($this->_fields as $column => $field)
197
		{
198
			// Ensure a default primary key is set
199 7
			if ($field instanceof Jam_Field AND $field->primary AND empty($this->_primary_key))
200
			{
201 6
				$this->_primary_key = $column;
0 ignored issues
show
Documentation Bug introduced by
It seems like $column can also be of type integer. However, the property $_primary_key is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
202
			}
203
204
			// Ensure a default plymorphic key is set
205 7
			if ($field instanceof Jam_Field_Polymorphic AND empty($this->_polymorphic_key))
206
			{
207 7
				$this->_polymorphic_key = $column;
0 ignored issues
show
Documentation Bug introduced by
It seems like $column can also be of type integer. However, the property $_polymorphic_key is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
208
			}
209
		}
210
211 7
		foreach ($this->_associations as $column => & $association)
212
		{
213 6
			$association->initialize($this, $column);
214
		}
215
216 7
		foreach ($this->_fields as $column => & $field)
217
		{
218 7
			$field->initialize($this, $column);
219 7
			$this->_defaults[$column] = $field->default;
220
		}
221
222 7
		if ( ! $this->_collection AND ($class = Jam::collection_prefix().Jam::capitalize_class_name($this->_model)) AND class_exists($class))
223
		{
224 5
			$this->_collection = $class;
225
		}
226
227
		// Meta object is initialized and no longer writable
228 7
		$this->_initialized = TRUE;
229
230
		// Final meta callback
231 7
		$this->_events->trigger('meta.after_finalize', $this);
232 7
	}
233
234
	/**
235
	 * Returns a string representation of the meta object.
236
	 *
237
	 * @return  string
238
	 */
239
	public function __toString()
240
	{
241
		return (string) get_class($this).': '.$this->_model;
242
	}
243
244
	/**
245
	 * Returns whether or not the meta object has finished initialization
246
	 *
247
	 * @return  boolean
248
	 */
249 3
	public function initialized()
250
	{
251 3
		return $this->_initialized;
252
	}
253
254 79
	public function collection($value = NULL)
255
	{
256 79
		if (func_num_args() !== 0)
257
		{
258
			return $this->set('collection', $value);
259
		}
260 79
		return $this->_collection;
261
	}
262
263 6
	public function validator($field, $options)
0 ignored issues
show
Unused Code introduced by
The parameter $field is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $options is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
264
	{
265 6
		$fields = func_get_args();
266 6
		$options = (array) array_pop($fields);
267
268 6
		if ($this->_with_options)
269
		{
270 1
			$options = Arr::merge($options, $this->_with_options);
271
		}
272
273 6
		$this->_validators[] = new Jam_Validator($fields, $options);
274
275 6
		return $this;
276
	}
277
278 1
	public function with_options($options)
279
	{
280 1
		$this->_with_options = $options;
281 1
		return $this;
282
	}
283
284
	public function end()
285
	{
286
		$this->_with_options = NULL;
287
		return $this;
288
	}
289
290 11
	public function validators()
291
	{
292 11
		return $this->_validators;
293
	}
294
295 19
	public function execute_validators(Jam_Validated $model, $force = FALSE)
296
	{
297 19
		foreach ($this->_validators as $validator)
298
		{
299 13
			$validator->validate_model($model, $force);
300
		}
301
302 19
		$model->validate();
303
304 19
		return $this;
305
	}
306
307
	/**
308
	 * Allows setting a variable only when not initialized.
309
	 *
310
	 * @param   string      $key
311
	 * @param   mixed       $value
312
	 * @return  $this
313
	 */
314 7
	protected function set($key, $value)
315
	{
316 7
		if ($this->_initialized)
317
		{
318
			throw new Kohana_Exception(':class already initialized, cannot set :key to :value', array(
319
				':class' => Jam::class_name($this->_model),
320
				':key'   => $key,
321
				':value' => $value,
322
			));
323
		}
324
325
		// Set key's value
326 7
		$this->{'_'.$key} = $value;
327
328 7
		return $this;
329
	}
330
331
	/**
332
	 * Allows appending an array to a variable only when not initialized.
333
	 *
334
	 * @param   string      $key
335
	 * @param   mixed       $value
336
	 * @return  $this
337
	 */
338 6
	protected function set_append($key, $value)
339
	{
340 6
		if ($this->_initialized)
341
		{
342
			// Throw exception
343
			throw new Kohana_Exception(':class already initialized, cannot append to :key', array(
344
				':class' => Jam::class_name($this->_model),
345
				':key'   => $key,
346
			));
347
		}
348
349 6
		if (is_array($value))
350
		{
351
			// Set key's value
352 6
			$this->{'_'.$key} = array_merge($this->{'_'.$key}, $value);
353
		}
354
355 6
		return $this;
356
	}
357
358
	/**
359
	 * Gets or sets the db group
360
	 *
361
	 * @param   string  $value
362
	 * @return  $this|string
363
	 */
364 161
	public function db($value = NULL)
365
	{
366 161
		if (func_num_args() !== 0)
367
		{
368 7
			return $this->set('db', $value);
369
		}
370
371 155
		return $this->_db ? $this->_db : Database::$default;
372
	}
373
374
	/**
375
	 * Returns the model name this object is attached to
376
	 *
377
	 * @return  string
378
	 */
379 267
	public function model()
380
	{
381 267
		return $this->_model;
382
	}
383
384
	/**
385
	 * Gets or sets the table
386
	 *
387
	 * @param   string  $value
388
	 * @return  $this|string
389
	 */
390 167
	public function table($value = NULL)
391
	{
392 167
		if (func_num_args() !== 0)
393
		{
394 6
			return $this->set('table', $value);
395
		}
396
397 167
		return $this->_table;
398
	}
399
400
	/**
401
	 * Getter / setter for individual fields.
402
	 *
403
	 * @param   string       $name     name of the field
404
	 * @param   mixed        $field    the field alias or object
405
	 * @return  Jam_Field|$this|null
406
	 */
407 261
	public function field($name, $field = NULL, $prepend = FALSE)
408
	{
409 261
		if ($field === NULL)
410
		{
411
			// Get the association
412 255
			return Arr::get($this->_fields, $name);
413
		}
414
415 7
		if ($this->_initialized)
416
		{
417
			// Cannot set after initialization
418
			throw new Kohana_Exception(':class already initialized, cannot set :field', array(
419
				':class' => Jam::class_name($this->_model),
420
				':field'   => $name,
421
			));
422
		}
423
424
		// Set the field
425 7
		if ($prepend)
426
		{
427
			$this->_fields = array($name => $field) + $this->_fields;
428
		}
429
		else
430
		{
431 7
			$this->_fields[$name] = $field;
432
		}
433
434
		// Return Jam_Meta
435 7
		return $this;
436
	}
437
438
	/**
439
	 * The same as field method, but throws an exception if association does not exist
440
	 *
441
	 * @param   string       $name     name of the field
442
	 * @param   mixed        $field    the field alias or object
443
	 * @return  Jam_Field|$this|null
444
	 */
445
	public function field_insist($name, $field = NULL)
446
	{
447
		if ( ! isset($this->_fields[$name]))
448
			throw new Kohana_Exception('The field :name for this model :model does not exist', array(':name' => $name, ':model' => $this->_model));
449
450
		return $this->field($name, $field);
451
	}
452
453 1
	public function attribute($name)
454
	{
455 1
		return Arr::get($this->_fields, $name, Arr::get($this->_associations, $name));
456
	}
457
458
	public function attribute_insist($name)
459
	{
460
		$attribute = $this->attribute($name);
461
462
		if ( ! $attribute)
463
			throw new Kohana_Exception('The attrubute :name for this model :model does not exist', array(':name' => $name, ':model' => $this->_model));
464
465
		return $attribute;
466
	}
467
468
469
	/**
470
	 * Gets and sets the fields for this object.
471
	 *
472
	 * Calling this multiple times will overwrite fields.
473
	 *
474
	 * @param   array|null  $fields
475
	 * @return  Jam_Field[]|$this
476
	 */
477 205
	public function fields(array $fields = NULL)
478
	{
479 205
		if ($fields === NULL)
480
		{
481
			// Return the fields
482 199
			return $this->_fields;
483
		}
484
485 7
		foreach ($fields as $name => $field)
486
		{
487
			// Set the field
488 7
			$this->field($name, $field);
489
		}
490
491
		// Return Jam_Meta
492 7
		return $this;
493
	}
494
495
	/**
496
	 * Getter / setter for individual associations.
497
	 *
498
	 * @param   string       $name     name of the association
499
	 * @param   mixed        $association    the association alias or object
500
	 * @return  Jam_Association|$this|null
501
	 */
502 754
	public function association($name, $association = NULL, $prepend = FALSE)
503
	{
504 754
		if ($association === NULL)
505
		{
506
			// Get the association
507 754
			return Arr::get($this->_associations, $name);
508
		}
509
510 6
		if ($this->_initialized)
511
		{
512
			// Cannot set after initialization
513
			throw new Kohana_Exception(':class already initialized, cannot set :association', array(
514
				':class' => Jam::class_name($this->_model),
515
				':association'   => $name,
516
			));
517
		}
518
519
		// Set the association
520 6
		if ($prepend)
521
		{
522
			$this->_associations = array($name => $association) + $this->_associations;
523
		}
524
		else
525
		{
526 6
			$this->_associations[$name] = $association;
527
		}
528
529
		// Return Jam_Meta
530 6
		return $this;
531
	}
532
533
	/**
534
	 * The same as assocation method, but throws an exception if association does not exist
535
	 * @param   string       $name     name of the association
536
	 * @param   mixed        $association    the association alias or object
537
	 * @return  Jam_Association|$this|null
538
	 * @see  association
539
	 */
540
	public function association_insist($name, $association = NULL)
541
	{
542
		if ( ! isset($this->_associations[$name]))
543
			throw new Kohana_Exception('The association :name for this model :model does not exist', array(':name' => $name, ':model' => $this->_model));
544
545
		return $this->association($name, $association);
546
	}
547
548
549
	/**
550
	 * Gets and sets the associations for this object.
551
	 *
552
	 * Calling this multiple times will overwrite associations.
553
	 *
554
	 * @param   array|null  $associations
555
	 * @return  Jam_Association[]|$this
556
	 */
557 6
	public function associations(array $associations = NULL)
558
	{
559 6
		if ($associations === NULL)
560
		{
561
			// Return the associations
562
			return $this->_associations;
563
		}
564
565 6
		foreach ($associations as $name => $association)
566
		{
567
			// Set the associations
568 6
			$this->association($name, $association);
569
		}
570
571
		// Return Jam_Meta
572 6
		return $this;
573
	}
574
575
	/**
576
	 * Returns the defaults for the object.
577
	 *
578
	 * If $name is specified, then the defaults
579
	 * for that field are returned.
580
	 *
581
	 * @param   string|null  $name
582
	 * @return  array|mixed|null
583
	 */
584 754
	public function defaults($name = NULL)
585
	{
586 754
		if ($name === NULL)
587
		{
588 754
			return $this->_defaults;
589
		}
590
591 1
		return $this->field($name)->default;
592
	}
593
594
	/**
595
	 * Returns or sets the name of the file used for errors.
596
	 *
597
	 * @return $this|string
598
	 */
599 202
	public function errors_filename($value = NULL)
600
	{
601 202
		if (func_num_args() !== 0)
602
		{
603
			return $this->set('errors_filename', $value);
604
		}
605
606 202
		return $this->_errors_filename;
607
	}
608
609
	/**
610
	 * Gets or sets the behaviors attached to the object.
611
	 *
612
	 * @param   array|null  $behaviors
613
	 * @return  Jam_Behavior[]|$this
614
	 */
615 6
	public function behaviors(array $behaviors = NULL)
616
	{
617 6
		if (func_num_args() == 0)
618
		{
619 1
			return $this->_behaviors;
620
		}
621
622
		// Try to append
623 6
		return $this->set_append('behaviors', $behaviors);
624
	}
625
626
627
	/**
628
	 * Get / Set individual behaviors.
629
	 *
630
	 * @param   string       $name     name of the association
631
	 * @param   mixed        $association    the association alias or object
0 ignored issues
show
Bug introduced by
There is no parameter named $association. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
632
	 * @return  Jam_Behavior|$this|null
633
	 */
634
	public function behavior($name, $behavior = NULL, $prepend = FALSE)
635
	{
636
		if ($behavior === NULL)
637
		{
638
			// Get the behavior
639
			return Arr::get($this->_behaviors, $name);
640
		}
641
642
		if ($this->_initialized)
643
		{
644
			// Cannot set after initialization
645
			throw new Kohana_Exception(':class already initialized, cannot set :behavior', array(
646
				':class' => Jam::class_name($this->_model),
647
				':behavior'   => $name,
648
			));
649
		}
650
651
		// Set the behavior
652
		if ($prepend)
653
		{
654
			$this->_behaviors = array($name => $behavior) + $this->_behaviors;
655
		}
656
		else
657
		{
658
			$this->_behaviors[$name] = $behavior;
659
		}
660
661
		// Return Jam_Meta
662
		return $this;
663
	}
664
665
	/**
666
	 * Gets the events attached to the object.
667
	 *
668
	 * @return  Jam_Event
669
	 */
670 577
	public function events()
671
	{
672 577
		return $this->_events;
673
	}
674
675
	/**
676
	 * Gets or sets the model's primary key.
677
	 *
678
	 * @param   string  $value
679
	 * @return  mixed
680
	 */
681 216
	public function primary_key($value = NULL)
682
	{
683 216
		if (func_num_args() !== 0)
684
		{
685 1
			return $this->set('primary_key', $value);
686
		}
687
688 216
		return $this->_primary_key;
689
	}
690
691
	/**
692
	 * Gets or sets the model's name key
693
	 *
694
	 * @param   string  $value
695
	 * @return  string|$this
696
	 */
697 34
	public function name_key($value = NULL)
698
	{
699 34
		if (func_num_args() !== 0)
700
		{
701 6
			return $this->set('name_key', $value);
702
		}
703
704 29
		return $this->_name_key;
705
	}
706
707
	/**
708
	 * Gets or sets the model's foreign key
709
	 *
710
	 * @param   string  $value
711
	 * @return  string|$this
712
	 */
713 1
	public function foreign_key($value = NULL)
714
	{
715 1
		if (func_num_args() !== 0)
716
		{
717 1
			return $this->set('foreign_key', $value);
718
		}
719
720 1
		return $this->_foreign_key;
721
	}
722
723
	/**
724
	 * Gets the unique key basend on a model method
725
	 *
726
	 * @param   string  $value
727
	 * @return  string
728
	 */
729 30
	public function unique_key($value = NULL)
730
	{
731 30
		if (is_callable($value) AND ! $this->initialized())
732
		{
733
			return $this->set('unique_key', $value);
734
		}
735
736 30
		if ($this->_unique_key)
737
		{
738
			return call_user_func($this->_unique_key, $value);
739
		}
740
		else
741
		{
742 30
			return (is_numeric($value) OR $value === NULL) ? $this->primary_key() : $this->name_key();
743
		}
744
	}
745
746
	/**
747
	 * Gets the model's polymorphic key.
748
	 *
749
	 * @param   string  $value
750
	 * @return  string
751
	 */
752 442
	public function polymorphic_key($value = NULL)
0 ignored issues
show
Unused Code introduced by
The parameter $value is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
753
	{
754 442
		return $this->_polymorphic_key;
755
	}
756
757
	/**
758
	 * Gets the model's child models
759
	 *
760
	 * @param   array  $children
761
	 * @return  array
762
	 */
763
	public function children(array $children = NULL)
764
	{
765
		if (func_num_args() == 0)
766
		{
767
			return $this->_children;
768
		}
769
770
		// Try to append
771
		return $this->set_append('children', $children);
772
	}
773
774
	/**
775
	 * Gets or sets the object's sorting properties
776
	 *
777
	 * @param   array|null  $value
778
	 * @return  array
779
	 */
780 1
	public function sorting($value = NULL)
781
	{
782 1
		if (func_num_args() !== 0)
783
		{
784 1
			return $this->set('sorting', $value);
785
		}
786
787 1
		return $this->_sorting;
788
	}
789
790
} // End Kohana_Jam_Meta
791