Chris@17: type = self::TYPE_UNDEFINED; Chris@17: Chris@17: $this->trait = is_null($trait)? null: BuilderHelpers::normalizeName($trait); Chris@17: $this->method = BuilderHelpers::normalizeIdentifier($method); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Sets alias of method. Chris@17: * Chris@17: * @param Node\Identifier|string $alias Alias for adaptated method Chris@17: * Chris@17: * @return $this The builder instance (for fluid interface) Chris@17: */ Chris@17: public function as($alias) { Chris@17: if ($this->type === self::TYPE_UNDEFINED) { Chris@17: $this->type = self::TYPE_ALIAS; Chris@17: } Chris@17: Chris@17: if ($this->type !== self::TYPE_ALIAS) { Chris@17: throw new \LogicException('Cannot set alias for not alias adaptation buider'); Chris@17: } Chris@17: Chris@17: $this->alias = $alias; Chris@17: return $this; Chris@17: } Chris@17: Chris@17: /** Chris@17: * Sets adaptated method public. Chris@17: * Chris@17: * @return $this The builder instance (for fluid interface) Chris@17: */ Chris@17: public function makePublic() { Chris@17: $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); Chris@17: return $this; Chris@17: } Chris@17: Chris@17: /** Chris@17: * Sets adaptated method protected. Chris@17: * Chris@17: * @return $this The builder instance (for fluid interface) Chris@17: */ Chris@17: public function makeProtected() { Chris@17: $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); Chris@17: return $this; Chris@17: } Chris@17: Chris@17: /** Chris@17: * Sets adaptated method private. Chris@17: * Chris@17: * @return $this The builder instance (for fluid interface) Chris@17: */ Chris@17: public function makePrivate() { Chris@17: $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); Chris@17: return $this; Chris@17: } Chris@17: Chris@17: /** Chris@17: * Adds overwritten traits. Chris@17: * Chris@17: * @param Node\Name|string ...$traits Traits for overwrite Chris@17: * Chris@17: * @return $this The builder instance (for fluid interface) Chris@17: */ Chris@17: public function insteadof(...$traits) { Chris@17: if ($this->type === self::TYPE_UNDEFINED) { Chris@17: if (is_null($this->trait)) { Chris@17: throw new \LogicException('Precedence adaptation must have trait'); Chris@17: } Chris@17: Chris@17: $this->type = self::TYPE_PRECEDENCE; Chris@17: } Chris@17: Chris@17: if ($this->type !== self::TYPE_PRECEDENCE) { Chris@17: throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); Chris@17: } Chris@17: Chris@17: foreach ($traits as $trait) { Chris@17: $this->insteadof[] = BuilderHelpers::normalizeName($trait); Chris@17: } Chris@17: Chris@17: return $this; Chris@17: } Chris@17: Chris@17: protected function setModifier(int $modifier) { Chris@17: if ($this->type === self::TYPE_UNDEFINED) { Chris@17: $this->type = self::TYPE_ALIAS; Chris@17: } Chris@17: Chris@17: if ($this->type !== self::TYPE_ALIAS) { Chris@17: throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); Chris@17: } Chris@17: Chris@17: if (is_null($this->modifier)) { Chris@17: $this->modifier = $modifier; Chris@17: } else { Chris@17: throw new \LogicException('Multiple access type modifiers are not allowed'); Chris@17: } Chris@17: } Chris@17: Chris@17: /** Chris@17: * Returns the built node. Chris@17: * Chris@17: * @return Node The built node Chris@17: */ Chris@17: public function getNode() : Node { Chris@17: switch ($this->type) { Chris@17: case self::TYPE_ALIAS: Chris@17: return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); Chris@17: case self::TYPE_PRECEDENCE: Chris@17: return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); Chris@17: default: Chris@17: throw new \LogicException('Type of adaptation is not defined'); Chris@17: } Chris@17: } Chris@17: }