    /*
     * call-seq:
     *   validate(document)
     *
     * Validate +document+ returning a list of errors
     */
    static VALUE validate(VALUE self, VALUE document)
    {
      xmlDocPtr doc;
      xmlDtdPtr dtd;

      Data_Get_Struct(self, xmlDtd, dtd);
      Data_Get_Struct(document, xmlDoc, doc);
      VALUE error_list      = rb_ary_new();

      xmlValidCtxtPtr ctxt = xmlNewValidCtxt();

      xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);

      xmlValidateDtd(ctxt, doc, dtd);

      xmlSetStructuredErrorFunc(NULL, NULL);

      xmlFreeValidCtxt(ctxt);

      return error_list;
    }