   (interactive)
   (unless username
     (setf username
-          (ido-completing-read "Switch to username: "
-                               (directory-files "~/.emacs.d/lisp/user/users/" nil "^[^.].*$"))))
+          (kotct/user-ask-username "Switch to username: ")))
   (kotct/user-unload-username)
   ;; make sure that if the load fails we reload the stuff we just unloaded
   ;; so that we are actually loaded with current-username's config


(defun kotct/user-get-default-username ()
  "Look up the default username set on this machine."
  (let ((filename "~/.emacs.d/lisp/user/default-username"))
    (if (file-exists-p filename)
        (with-temp-buffer
          (insert-file-contents filename)
          (replace-regexp-in-string "\n\\'" "" (buffer-string)))
      ;; default to base-config
      "base-config")))

(defun kotct/user-load-username (username)
  "Load the personal config of USERNAME.

    (require (intern (concat username "-hub")))
    (setf kotct/user-current-username username)))

(defun kotct/user-ask-username (prompt)
  "Use ido to ask the user for a username,
prompting the user with PROMPT."
  (ido-completing-read prompt
                       (directory-files "~/.emacs.d/lisp/user/users/" nil "^[^.].*$")))

(defun kotct/user-unload-username (&optional username)
  "Unload the personal config of USERNAME, or if USERNAME is nil, `kotct/user-current-username'."
  (unless username (setf username kotct/user-current-username))
