    /*
     * call-seq:
     *  +(node_set)
     *
     *  Concatenation - returns a new NodeSet built by concatenating the node set
     *  with +node_set+ to produce a third NodeSet
     */
    static VALUE plus(VALUE self, VALUE rb_other)
    {
      xmlNodeSetPtr node_set;
      xmlNodeSetPtr other;
      xmlNodeSetPtr new;

      if(! rb_funcall(rb_other, rb_intern("is_a?"), 1, cNokogiriXmlNodeSet))
        rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");

      Data_Get_Struct(self, xmlNodeSet, node_set);
      Data_Get_Struct(rb_other, xmlNodeSet, other);

      new = xmlXPathNodeSetMerge(NULL, node_set);
      new = xmlXPathNodeSetMerge(new, other);

      VALUE new_set = Nokogiri_wrap_xml_node_set(new);

      rb_iv_set(new_set, "@document", rb_iv_get(self, "@document"));

      return new_set;
    }