Fix missing `without-special-symbol-access' in `funcall-with-attribute-context'
[clinton/lisp-on-lines.git] / src / standard-descriptions / edit.lisp
index aa71065..9993080 100644 (file)
@@ -1,56 +1,79 @@
 (in-package :lisp-on-lines)
 
-
 (define-description editable ()
   ()
   (:mixinp t))
 
-(define-layered-class standard-attribute
+(define-layered-class define-description-attribute
   :in-layer #.(defining-description 'editable)
   ()
   ((edit-attribute-p 
     :initform :inherit 
     :layered-accessor attribute-editp
     :initarg :editp
-    :layered t)
+    :layered t
+    :special t)
    (setter
     :initarg :setter
     :layered t
-    :accessor attribute-setter
+    :layered-accessor attribute-setter
     :initform nil)
    (attribute-editor 
-    :initarg :input 
+    :initarg :editor
     :layered t
     :accessor attribute-editor
-    :initform nil
+    :initform (make-instance 'attribute-editor)
     :documentation "This ones a bit odd")))
 
-(defmethod attribute-editor :around (attribute)
-  (flet ((find-editor-class (spec)
-          (let ((class (getf spec :class))
-                (type (getf spec :type)))
-            (or class (when (and type (symbolp type)) 
-                        (intern (format nil "~A-~A" type 'attribute-editor)))
-                'string-attribute-editor))))
-  (let ((editor? (call-next-method)))
-    (if (listp editor?)
-       (setf (attribute-editor attribute)
-             (apply #'make-instance (find-editor-class editor?) 
-                    editor?))
-       (call-next-method)))))
-
+(define-layered-method attribute-setter (object)
+  nil)
+
+(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 (unless (eq (find-package :cl)
+                                 (symbol-package type)) 
+                       (find-class (intern name (symbol-package type)) nil))
+                     (find-class (intern name) nil)
+                     (find-class (intern name :lol) nil)
+                     'string-attribute-editor))))))
 
 (defclass attribute-editor ()
-    ((type :initarg :type
-          :initform 'string)
+    ((class :initarg :class)
+     (type :initarg :type
+          :initform 'string
+          :accessor attribute-editor-type)
      (parser :initarg :parse-using
             :initform 'identity
             :accessor attribute-editor-parsing-function)
+     (attributes :initarg :attributes
+                :initform nil
+                :accessor attribute-editor-attributes)
      (prompt :initarg :prompt 
-            :initform nil)))
+            :initform nil)
+     (unbound-value
+        :initarg :unbound-value
+       :initform "")))
+
+
 
 (defclass string-attribute-editor (attribute-editor) ())
 (defclass text-attribute-editor (string-attribute-editor) ())
+
+(deftype password () 'string)
+
 (defclass password-attribute-editor (string-attribute-editor) ())
 
 (defclass number-attribute-editor (attribute-editor) ()
 (define-layered-method attribute-editp 
   :in-layer #.(defining-description 'editable)
   ((attribute standard-attribute))
+  (let ((value (attribute-value attribute)))
+    (unless (or (unbound-slot-value-p value)
+               (typep value 
+                    (attribute-editor-type 
+                     (attribute-editor attribute))))
+      (return-from attribute-editp nil)))
   (let ((edit?       (call-next-method)))
+
     (if (eq :inherit edit?)
        (attribute-value (find-attribute 
                          (attribute-description attribute)