anchor.diff:  ;;; strategies might be different. Should we keep a cache of objects for a set
   ;;; of uset strategies?
   
  -(defclass shader (shader-source gl-object)
  +(define-gl-object shader (shader-source)
     ((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
  
positive.code:      if (not (gl-finalized-p obj))
       do (gl-finalize obj)))
  
  (defclass gl-object ()
    ((id :accessor id :initarg :id :initform 0
         :documentation "ID from OpenGL of object"))
    (:documentation "Abstract class for objects allocated in OpenGL."))
  
  (defgeneric gl-valid-p (obj))
  
  (defmethod gl-valid-p ((obj gl-object))
  
negative.code:                      :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
  