1: <?php
2:
3: namespace Chromabits\Nucleus\Meditation;
4:
5: use Chromabits\Nucleus\Control\Maybe;
6: use Chromabits\Nucleus\Data\ArrayList;
7: use Chromabits\Nucleus\Data\ArrayMap;
8: use Chromabits\Nucleus\Data\Iterable;
9: use Chromabits\Nucleus\Meditation\Constraints\AbstractTypeConstraint;
10:
11: 12: 13: 14: 15: 16:
17: class TypedSpec extends Spec
18: {
19: const ANNOTATION_TYPE = 'type';
20:
21: 22: 23: 24: 25: 26: 27: 28:
29: public function withFieldType($fieldName, AbstractTypeConstraint $type)
30: {
31: return $this->withFieldAnnotation(
32: $fieldName,
33: static::ANNOTATION_TYPE,
34: $type
35: );
36: }
37:
38: 39: 40: 41: 42:
43: public function getTypes()
44: {
45: return $this->getAnnotation(static::ANNOTATION_TYPE);
46: }
47:
48: 49: 50: 51: 52: 53: 54:
55: protected function getInternalFieldConstraints($fieldName)
56: {
57: return parent::getInternalFieldConstraints($fieldName)
58: ->append(ArrayList::of([$this->getFieldType($fieldName)]));
59: }
60:
61: 62: 63: 64: 65: 66: 67:
68: public function getFieldType($fieldName)
69: {
70: return Maybe::fromMaybe(
71: Boa::any(),
72: $this->getFieldAnnotation($fieldName, static::ANNOTATION_TYPE)
73: );
74: }
75: }