_wrapperNode->get(); } private static ?string $parentNamespace = null; public function __construct(WrapperDocument $wrapperNode) { parent::__construct(); parent::registerNodeClass('DOMDocument', self::class); $this->nodeMap = new NodeMap(); // Use a weak reference here to prevent a circular reference $this->_wrapperNode = \WeakReference::create($wrapperNode); if (self::$parentNamespace === null) { self::$parentNamespace = substr(__NAMESPACE__, 0, strrpos(__NAMESPACE__, '\\')); } } public function getWrapperNode(?\DOMNode $node = null): WrapperNode { // If the node is a Document then the wrapperNode is this's wrapperNode // property. if ($node instanceof Document || $node === null) { return $this->wrapperNode; } // If the wrapper node already exists then return that. if ($wrapperNode = $this->nodeMap->get($node)) { return $wrapperNode; } // If the node didn't exist we must construct the wrapper node's class name // based upon the node's class name if ($node instanceof \DOMAttr) { $className = 'Attr'; } elseif ($node instanceof \DOMCDATASection) { $className = 'CDATASection'; } elseif ($node instanceof \DOMComment) { $className = 'Comment'; } elseif ($node instanceof \DOMDocument) { $className = 'Document'; } elseif ($node instanceof \DOMDocumentFragment) { $className = 'DocumentFragment'; } elseif ($node instanceof \DOMDocumentType) { $className = 'DOMDocumentType'; } elseif ($node instanceof \DOMElement) { $namespace = $node->namespaceURI; if ($namespace === null) { if ($node->nodeName === 'template') { $className = 'HTMLTemplateElement'; } else { $className = 'HTMLElement'; } } elseif ($namespace === Parser::SVG_NAMESPACE) { $className = 'SVGElement'; } elseif ($namespace === Parser::MATHML_NAMESPACE) { $className = 'MathMLElement'; } else { $className = 'Element'; } } elseif ($node instanceof \DOMProcessingInstruction) { $className = 'ProcessingInstruction'; } elseif ($node instanceof \DOMText) { $className = 'Text'; } elseif ($node instanceof XMLDocument) { $className = 'XMLDocument'; } // Nodes cannot be created from their constructors normally return Reflection::createFromProtectedConstructor(self::$parentNamespace . "\\$className", $node); } }