   (-> circle
       (update-role role-name map->Role)
       (update-role role-name dissoc :roles)))
-
-(defn create-circle
-  "Create a new circle with no parent."
-  [name]
-  (validate-not (empty? name) "Name may not be empty")
-  (map->Circle {:name name}))
 
 (defn add-role
   "Adds a role to a circle.  The role may not conflict with an existing role.

  (let [update-args
        (concat [circle (interleave (repeat :roles) path) fn] params)]
    (apply update-in update-args)))

;; ## Validators ##

(defn- validate [valid? err-msg]
  (when-not valid? (throw (IllegalArgumentException. err-msg))))

(defn- validate-not [invalid? err-msg]
  (validate (not invalid?) err-msg))

(defn- validate-role-exists [circle role-name]
  (validate-not (empty? (get-role circle role-name))
                (str "Role not found: " role-name)))

(defn- validate-role-name [role-name]
  (validate-not (empty? role-name) "Name may not be empty"))


(defn- validate-role-updates [circle role-name]

        (assoc-if :domains domains)
        (assoc-if :accountabilities accountabilities))))

(defn create-circle
  "Create a new circle with no parent."
  [name]
  (validate-not (empty? name) "Name may not be empty")
  (map->Circle {:name name}))

(defn is-subrole-circle?
  "Returns true if the given circle really is a circle. If you give it a
  role, it will tell you if the given role inside the given circle is a circle."
  [circle role-name]
  (is-circle? (get-role circle role-name)))

;; ## Generalization Functions ##

(defn- update-role-raw
  "Generalizes any role manipulation. The entity-path is the path to the entity
