+ :initform nil)
+ (attribute-editor
+ :initarg :editor
+ :layered t
+ :accessor attribute-editor
+ :initform (make-instance 'attribute-editor)
+ :documentation "This ones a bit odd")))
+
+(defmethod shared-initialize :after ((object standard-attribute)
+ slots &rest args &key input &allow-other-keys)
+
+ (when input
+ (setf (attribute-editor object)
+ (apply #'make-instance (find-editor-class input)
+ input))))
+
+
+(defun find-editor-class (spec)
+ (let ((class (getf spec :class))
+ (type (getf spec :type)))
+ (or class (when
+ (and type (symbolp type))
+ (let ((name (format nil "~A-~A" type 'attribute-editor)))
+ (or (find-class (intern name (symbol-package type)) nil)
+ (find-class (intern name) nil)
+ 'string-attribute-editor))))))
+
+(defclass attribute-editor ()
+ ((class :initarg :class)
+ (type :initarg :type
+ :initform 'string
+ :accessor attribute-editor-type)
+ (parser :initarg :parse-using
+ :initform 'identity
+ :accessor attribute-editor-parsing-function)
+ (prompt :initarg :prompt
+ :initform nil)
+ (unbound-value
+ :initarg :unbound-value
+ :initform "")))
+
+
+
+(defclass string-attribute-editor (attribute-editor) ())
+(defclass text-attribute-editor (string-attribute-editor) ())
+
+(deftype password () 'string)