    /*
     * call-seq:
     *  add_namespace_definition(prefix, href)
     *
     * Adds a namespace definition with +prefix+ using +href+ value. The result is
     * as if parsed XML for this node had included an attribute
     * 'xmlns:prefix=value'.  A default namespace for this node ("xmlns=") can be
     * added by passing 'nil' for prefix. Namespaces added this way will not
     * show up in #attributes, but they will be included as an xmlns attribute
     * when the node is serialized to XML.
     */
    static VALUE add_namespace_definition(VALUE self, VALUE prefix, VALUE href)
    {
      xmlNodePtr node, namespacee;
      xmlNsPtr ns;

      Data_Get_Struct(self, xmlNode, node);
      namespacee = node ;

      ns = xmlSearchNs(
          node->doc,
          node,
          (const xmlChar *)(NIL_P(prefix) ? NULL : StringValuePtr(prefix))
      );

      if(!ns) {
        if (node->type != XML_ELEMENT_NODE) {
          namespacee = node->parent;
        }
        ns = xmlNewNs(
            namespacee,
            (const xmlChar *)StringValuePtr(href),
            (const xmlChar *)(NIL_P(prefix) ? NULL : StringValuePtr(prefix))
        );
      }

      if (!ns) return Qnil ;

      if(NIL_P(prefix) || node != namespacee) xmlSetNs(node, ns);

      return Nokogiri_wrap_xml_namespace(node->doc, ns);
    }