    /*
     * call-seq:
     *  validate_document(document)
     *
     * Validate a Nokogiri::XML::Document against this Schema.
     */
    static VALUE validate_document(VALUE self, VALUE document)
    {
      xmlDocPtr doc;
      xmlSchemaPtr schema;

      Data_Get_Struct(self, xmlSchema, schema);
      Data_Get_Struct(document, xmlDoc, doc);

      VALUE errors = rb_ary_new();

      xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);

      if(NULL == valid_ctxt) {
        // we have a problem
        rb_raise(rb_eRuntimeError, "Could not create a validation context");
      }

    #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
      xmlSchemaSetValidStructuredErrors(
        valid_ctxt,
        Nokogiri_error_array_pusher,
        (void *)errors
      );
    #endif

      xmlSchemaValidateDoc(valid_ctxt, doc);

      xmlSchemaFreeValidCtxt(valid_ctxt);

      return errors;
    }