Chris@17: implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node); Chris@17: } Chris@17: Chris@17: /** Chris@17: * @param ClassNode $node Chris@17: * @return bool Chris@17: */ Chris@17: private function implementsAThrowableInterface(ClassNode $node) Chris@17: { Chris@17: foreach ($node->getInterfaces() as $type) { Chris@17: if (is_a($type, 'Throwable', true)) { Chris@17: return true; Chris@17: } Chris@17: } Chris@17: Chris@17: return false; Chris@17: } Chris@17: Chris@17: /** Chris@17: * @param ClassNode $node Chris@17: * @return bool Chris@17: */ Chris@17: private function doesNotExtendAThrowableClass(ClassNode $node) Chris@17: { Chris@17: return !is_a($node->getParentClass(), 'Throwable', true); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Applies patch to the specific class node. Chris@17: * Chris@17: * @param ClassNode $node Chris@17: * Chris@17: * @return void Chris@17: */ Chris@17: public function apply(ClassNode $node) Chris@17: { Chris@17: $this->checkItCanBeDoubled($node); Chris@17: $this->setParentClassToException($node); Chris@17: } Chris@17: Chris@17: private function checkItCanBeDoubled(ClassNode $node) Chris@17: { Chris@17: $className = $node->getParentClass(); Chris@17: if ($className !== 'stdClass') { Chris@17: throw new ClassCreatorException( Chris@17: sprintf( Chris@17: 'Cannot double concrete class %s as well as implement Traversable', Chris@17: $className Chris@17: ), Chris@17: $node Chris@17: ); Chris@17: } Chris@17: } Chris@17: Chris@17: private function setParentClassToException(ClassNode $node) Chris@17: { Chris@17: $node->setParentClass('Exception'); Chris@17: Chris@17: $node->removeMethod('getMessage'); Chris@17: $node->removeMethod('getCode'); Chris@17: $node->removeMethod('getFile'); Chris@17: $node->removeMethod('getLine'); Chris@17: $node->removeMethod('getTrace'); Chris@17: $node->removeMethod('getPrevious'); Chris@17: $node->removeMethod('getNext'); Chris@17: $node->removeMethod('getTraceAsString'); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Returns patch priority, which determines when patch will be applied. Chris@17: * Chris@17: * @return int Priority number (higher - earlier) Chris@17: */ Chris@17: public function getPriority() Chris@17: { Chris@17: return 100; Chris@17: } Chris@17: }