+(defmethod decompose-describe-object ((object t))
+ #+cmu
+ (destructuring-bind (description named-p &rest parts)
+ (inspect::describe-parts object)
+ (if (equal parts (list object))
+ (values description nil nil)
+ (values description named-p parts)))
+ #+sbcl(sb-impl::inspected-parts object))
+
+(defmethod decompose-describe-object ((object (eql t)))
+ (values (call-next-method) nil nil))
+
+(defmethod decompose-describe-object ((object (eql nil)))
+ (values (call-next-method) nil nil))
+
+(defun propper-list-p (object)
+ (and (listp object) (null (cdr (last object)))))
+
+(defmethod decompose-describe-object ((object cons))
+ (if (propper-list-p object)
+ (values (call-next-method) nil object)
+ (values "The object is a CONS." nil (list (car object) (cdr object)))))
+
+(defmethod decompose-describe-object ((object #+cmu alien:system-area-pointer
+ #+sbcl sb-alien:system-area-pointer))
+ (values "The object is a SYSTEM-AREA-POINTER" nil nil))
+
+(defmethod decompose-describe-object ((object (eql *ginspect-unbound-object-marker*)))
+ (values "The slot is unbound" nil nil))
+
+#+cmu
+(defmethod decompose-describe-object ((object symbol))
+ (values
+ (call-next-method) t
+ (list
+ (cons "Name" (symbol-name object))
+ (cons "Package" (symbol-package object))
+ (cons "Value" (if (boundp object)
+ (symbol-value object)
+ *ginspect-unbound-object-marker*))
+ (cons "Function" (if (fboundp object)
+ (symbol-function object)
+ *ginspect-unbound-object-marker*))
+ (cons "Plist" (symbol-plist object)))))
+
+(defmethod decompose-describe-object ((object standard-object))
+ (values
+ (format nil "The instance is an object of type ~A."
+ (class-name (class-of object)))
+ t
+ (loop
+ for slotd in (class-slots (class-of object))
+ when (slot-readable-p slotd)
+ collect (let* ((slot-name (slot-definition-name slotd))
+ (slot-value (if (slot-boundp object slot-name)
+ (slot-value object slot-name)
+ *ginspect-unbound-object-marker*)))
+ (cons (string slot-name) slot-value)))))
+
+
+(defmethod object-has-parts-p ((object t))
+ (nth-value 2 (decompose-describe-object object)))
+
+(defmethod object-has-parts-p ((object cons))
+ t)
+
+(defmethod object-has-parts-p ((object standard-object))
+ (class-slots (class-of object)))
+
+(defmethod object-has-parts-p ((object vector))
+ (not (zerop (length object))))
+
+
+(defmethod object-to-string ((object t))