anchor.diff:                       :initform nil)
      (log :reader render-error-log :initarg :error-log :initform nil))
     (:report report-render-error))
  +
  +(define-protocol-class gl-object ()
  +  ((:accessor id :documentation "The OpenGL ID of an object.")
  +   (:accessor gl-proxy :documentation "Object for accessing the associated
  +OpenGL object"))
  +  (:documentation "Class representing any OpenGL object."))
  +
  +(defclass %gl-object ()
  +  ((%id :accessor %id :initform 0)))
  +
  +(defclass gl-object-mixin ()
  +  ((gl-proxy :accessor gl-proxy :initarg :gl-proxy)))
  +
  +(defmethod initialize-instance :after ((obj gl-object-mixin) &key (id 0 idp))
  +  (when idp
  +    (setf (id obj) id)))
  +
  +(defmethod id ((obj gl-object-mixin))
  +  (%id (gl-proxy obj)))
  +
  +(defmethod (setf id) (val (obj gl-object-mixin))
  +  (setf (%id (gl-proxy obj)) val))
  +
  +(defmacro define-gl-object (name super-classes slots &rest options)
  +  (let* ((sym-name (symbol-name name))
  +         (proxy-name (intern (concatenate 'string "%" sym-name)))
  +         (init-mixin-name (intern (concatenate 'string
  +                                               "%"
  +                                               sym-name
  +                                               (symbol-name '#:-proxy-init-mixin)))))
  +    `(progn
  +       (defclass ,proxy-name (%gl-object) ())
  +       (defclass ,init-mixin-name () () (:default-initargs :gl-proxy (make-instance ',proxy-name)))
  +       (defclass ,name (,@super-classes gl-object ,init-mixin-name gl-object-mixin)
  +         ,slots
  +         ,@options))))
   
   (defgeneric gl-finalize (obj &optional errorp)
     (:documentation "Allocate any OpenGL resources needed for OBJ and perform any
  
positive.code: ;;; strategies might be different. Should we keep a cache of objects for a set
  ;;; of uset strategies?
  
  (defclass shader (shader-source gl-object)
    ((status :accessor status :initarg :status)
     (compiler-log :accessor compiler-log :initarg :compiler-log :initform nil))
    (:documentation "The LPSG object that holds the source code for an OpenGL shader, information
  
negative.code:      if (not (gl-finalized-p obj))
       do (gl-finalize obj)))
  
  (defgeneric gl-valid-p (obj))
  
  (defmethod gl-valid-p ((obj gl-object))
  