1 | <?php |
||
29 | final class Trait_ implements ProjectFactoryStrategy |
||
30 | { |
||
31 | /** |
||
32 | * Returns true when the strategy is able to handle the object. |
||
33 | * |
||
34 | * @param TraitNode $object object to check. |
||
35 | * @return boolean |
||
36 | */ |
||
37 | 1 | public function matches($object) |
|
41 | |||
42 | /** |
||
43 | * Creates an TraitElement out of the given object. |
||
44 | * Since an object might contain other objects that need to be converted the $factory is passed so it can be |
||
45 | * used to create nested Elements. |
||
46 | * |
||
47 | * @param TraitNode $object object to convert to an TraitElement |
||
48 | * @param StrategyContainer $strategies used to convert nested objects. |
||
49 | * @param Context $context |
||
50 | * @return TraitElement |
||
51 | */ |
||
52 | 6 | public function create($object, StrategyContainer $strategies, Context $context = null) |
|
53 | { |
||
54 | 6 | if (!$this->matches($object)) { |
|
55 | 1 | throw new InvalidArgumentException( |
|
56 | 1 | sprintf('%s cannot handle objects with the type %s', |
|
57 | 1 | __CLASS__, |
|
58 | 1 | is_object($object) ? get_class($object) : gettype($object) |
|
59 | ) |
||
60 | ); |
||
61 | } |
||
62 | |||
63 | 5 | $docBlock = $this->createDocBlock($object->getDocComment(), $strategies, $context); |
|
64 | |||
65 | 5 | $trait = new TraitElement($object->fqsen, $docBlock); |
|
66 | |||
67 | 5 | if (isset($object->stmts)) { |
|
68 | 3 | foreach ($object->stmts as $stmt) { |
|
69 | 3 | switch (get_class($stmt)) { |
|
70 | case PropertyNode::class: |
||
71 | 1 | $properties = new PropertyIterator($stmt); |
|
72 | 1 | foreach ($properties as $property) { |
|
73 | 1 | $element = $this->createMember($property, $strategies, $context); |
|
74 | 1 | $trait->addProperty($element); |
|
75 | } |
||
76 | 1 | break; |
|
77 | case ClassMethod::class: |
||
78 | 1 | $method = $this->createMember($stmt, $strategies, $context); |
|
79 | 1 | $trait->addMethod($method); |
|
80 | 1 | break; |
|
81 | case TraitUse::class: |
||
82 | 1 | foreach ($stmt->traits as $use) { |
|
83 | 1 | $trait->addUsedTrait(new Fqsen('\\'. $use->toString())); |
|
84 | } |
||
85 | 3 | break; |
|
86 | } |
||
87 | } |
||
88 | } |
||
89 | |||
90 | 5 | return $trait; |
|
91 | } |
||
92 | |||
93 | /** |
||
94 | * @param Node|PropertyIterator|Doc $stmt |
||
95 | * @param StrategyContainer $strategies |
||
96 | * @param Context $context |
||
97 | * @return Element |
||
98 | */ |
||
99 | 3 | private function createMember($stmt, StrategyContainer $strategies, Context $context = null) |
|
104 | |||
105 | /** |
||
106 | * @param Doc $docBlock |
||
107 | * @param StrategyContainer $strategies |
||
108 | * @param Context $context |
||
109 | * @return null|\phpDocumentor\Reflection\DocBlock |
||
110 | */ |
||
111 | 5 | private function createDocBlock(Doc $docBlock = null, StrategyContainer $strategies, Context $context = null) |
|
119 | } |