 MODULE is a keyword, SUBMODULE is a symbol. e.g. :lang 'emacs-lisp.
 
 Used by `require!' and `depends-on!'."
-  (puthash (cons module submodule)
-           (doom-enlist (or flags t))
-           doom-modules))
+  (let ((key (cons module submodule)))
+    (puthash key
+             (or (doom-enlist flags)
+                 (gethash key doom-modules)
+                 '(t))
+             doom-modules)))
 
 (defun doom-module-pairs ()
   "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells. The list

  "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol).

The module is only loaded once. If RELOAD-P is non-nil, load it again."
  (when (or reload-p (not (doom-module-loaded-p module submodule)))
    (let ((module-path (doom-module-path module submodule)))
      (if (not (file-directory-p module-path))
          (lwarn 'doom-modules :warning "Couldn't find module '%s %s'"

       ,@(cl-loop for (module . submodule) in (doom-module-pairs)
                  for module-path = (doom-module-path module submodule)
                  collect `(load! init ,module-path t) into inits
                  collect `(load! config ,module-path t) into configs
                  finally return (append inits configs))

       (when (display-graphic-p)
