anchor.diff:  		  :accessor configuration
   		  :documentation "How to configure this item-type")))
   
  -(defmacro one-of (options &rest args)
  -  `(make-instance 'one-of-configuration-option-type
  -		  :options (list ,@(mapcar (lambda (option)
  -					     (destructuring-bind (name title &rest args)
  -						 option
  -					       `(apply #'make-configuration-type-item ',name (cons ',title ',args))))
  -					   options))
  -		  ,@args))
  -
  -(defmacro some-of (options &rest args)
  -  `(make-instance 'list-configuration-option-type
  -		  :options (list (mapcar #'make-configuration-type-item ',options))
  -		  ,@args))
  -
  -(defmacro text (&rest args)
  -  `(make-instance 'text-configuration-option-type
  -		  ,@args))
  -
  -(defmacro url (&rest args)
  -  `(make-instance 'url-configuration-option-type
  -		  ,@args))
  -
  -(defmacro email (&rest args)
  -  `(make-instance 'email-configuration-option-type
  -		  ,@args))
  +(define-configuration-option-type :one-of (&rest options)
  +  (make-instance
  +   'one-of-configuration-option-type
  +   :options (list (mapcar
  +		   (lambda (option)
  +		     (destructuring-bind (name title &rest args)
  +			 option
  +		       (apply #'make-configuration-type-item
  +			      name (cons title args))))
  +		   options))))
  +
  +(define-configuration-option-type :some-of (options &rest args)
  +  (apply #'make-instance 'list-configuration-option-type
  +	 (append
  +	  (list
  +	   :options (list (mapcar #'make-configuration-type-item options)))
  +	 args)))
  +
  +(define-configuration-option-type :text (&rest args)
  +  (apply #'make-instance 'text-configuration-option-type
  +	 args))
  +
  +(define-configuration-option-type :url (&rest args)
  +  (apply #'make-instance 'url-configuration-option-type
  +	 args))
  +
  +(define-configuration-option-type :email (&rest args)
  +  (apply #'make-instance 'email-configuration-option-type
  +	 args))
   
   (defmacro path-name (&rest args)
     `(make-instance 'pathname-configuration-option-type
  
positive.code:    (type :initarg :type
  	 :accessor option-type
  	 :initform (error "Provide the option type")
  	 :documentation "The option type"))
    (:documentation "A configuration option"))
  
  (defclass configuration-option-type ()
    ((default :initarg :default
       :initform nil
       :accessor default
       :documentation "The default value if there is one")))
  
  (defun process-configuration-option-value (option)
    (%process-configuration-option-value (type option) option))
  
  (defmethod %process-configuration-option-value ((type configuration-option-type)
  						option)
    )  
  
  (defclass one-of-configuration-option-type (configuration-option-type)
    ((options :initarg :options
  
negative.code: 		   :name name
  		   :title title
  		   :documentation documentation
  		   :options
  		   (mapcar
  		    (lambda (option)
  		      (destructuring-bind (name title type-spec &rest rest)
  			  option
  			(apply #'make-configuration-option
  			       (append (list name title type-spec)
  				       rest))))
  		    options))))
  
  (defun make-configuration-option (name title type-spec &rest args)
    (apply #'make-instance 'configuration-option
  	 (append
  	  (list :name name
  		:title title
  		:type (make-configuration-option-type type-spec))
  	  args)))
  
  (defun make-configuration-option-type (type-spec)
    (multiple-value-bind (key params)
        (if (listp type-spec)
  	  (values
  	   (first type-spec)
  	   (rest type-spec))
  	  (values
  	   type-spec nil))
      (multiple-value-bind (builder found)
  	(gethash key *option-types*)
        (if (not found)
  	  (error "Found no definition for type ~A" key)
  	  (apply builder params)))))
  		 