+(define-condition property-access-error (error)
+ ((property-name :initarg :property-name :reader property-access-error-property-name)
+ (class-name :initarg :class-name :reader property-access-error-class-name)
+ (message :initarg :message :reader property-access-error-message))
+ (:report (lambda (condition stream)
+ (format stream "Error accessing property '~A' on class '~A': ~A"
+ (property-access-error-property-name condition)
+ (property-access-error-class-name condition)
+ (property-access-error-message condition)))))
+
+(define-condition property-unreadable-error (property-access-error)
+ ()
+ (:default-initargs :message "property is not readable"))
+
+(define-condition property-unwritable-error (property-access-error)
+ ()
+ (:default-initargs :message "property is not writable"))
+