    /*
     * call-seq:
     *  new
     *
     * Create a new document
     */
    static VALUE new(int argc, VALUE *argv, VALUE klass)
    {
      VALUE uri, external_id, rest, rb_doc;

      rb_scan_args(argc, argv, "0*", &rest);
      uri         = rb_ary_entry(rest, 0);
      external_id = rb_ary_entry(rest, 1);

      htmlDocPtr doc = htmlNewDoc(
          RTEST(uri) ? (const xmlChar *)StringValuePtr(uri) : NULL,
          RTEST(external_id) ? (const xmlChar *)StringValuePtr(external_id) : NULL
      );
      rb_doc = Nokogiri_wrap_xml_document(klass, doc);
      rb_funcall2(rb_doc, rb_intern("initialize"), argc, argv);
      return rb_doc ;
    }