               :jquery
               :clostache-templater
               :cylon
+              :cylon/signup             ; enable on with +signup switch
+              :cylon/log-emailer        ; enable on with +signup switch
+              :cylon/file-storage       ; TODO should be configurable
               :aggregate-template-model
               :protected-site-website
               }
    :files [{:template "protected-site/README.md" :target "README.md"}
            ]}
+
+  ;; TODO: It would be better for modules to have dependencies. Therefore, :cylon/signup would depend on :cylon/log-emailer. +sendgrid would augment with :sendgrid-emailer and diminish :cylon/log-emailer
 
   "intro"
   {:description "An introduction to Clojure (training course content)"

     :constructor modular.bootstrap.menu/new-bootstrap-menu}

  ;; Security components
  {:component :cylon/file-backed-user-store
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]
                          ]
   :constructor cylon.user.file-backed-store/new-file-backed-user-store
   }

  {:component :cylon/cookie-session-store
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]
                          ]
   :constructor cylon.session.cookie-session-store/new-cookie-session-store}

  {:component :cylon/atom-backed-token-store
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]
                          ]
   :constructor cylon.token-store.atom-backed-store/new-atom-backed-token-store}

  {:component :cylon/pbkdf2-password-algo
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]
                          ]
   :constructor cylon.password.pbkdf2/new-pbkdf2-hash}

  {:component :cylon/user-store-password-verifier
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]
                          ]
   :constructor cylon.password/new-user-store-password-verifier}

  {:component :cylon/login
   :library-dependencies [[cylon "0.6.0-SNAPSHOT"]
                          ;; temp while in checkouts
                          [cheshire "5.3.1"]]
   :constructor cylon.user.login/new-login
   }

  #_{:component :login-form-menu-items
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]
                            [juxt.modular/menu "0.5.3"]]
     :constructor modular.menu.cylon/new-login-form-menu-items
     }

  #_{:component :cylon/login-form-bootstrap-renderer
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]
                            [juxt.modular/bootstrap "0.2.0"]]
     :constructor modular.bootstrap.cylon.login-form/new-bootstrap-login-form-renderer
     }

  #_{:component :boilerplate
     :library-dependencies [[juxt.modular/bootstrap "0.2.0"]]
     :constructor {{name}}.boilerplate/new-boilerplate
     }

  #_{:component :cylon/atom-backed-session-store
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.session/new-atom-backed-session-store
     :args [:expiry-seconds 3600 :id :login]
     }

  #_{:component :cylon/default-user-domain
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.user/new-default-user-domain
     }

  #_{:component :cylon/pbkdf2-password-hash
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.pbkdf2/new-pbkdf2-password-hash
     }

  #_{:component :cylon/user-file
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.user/new-user-file
     ;; TODO The args should belong to the instance
     :args [:file (io/file (System/getProperty "user.home") ".{{name}}-users.edn")]
     }

  #_{:component :authorizer
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.authorization/new-logged-in-authorizer
     }

  #_{:component :user-domain-seeder
     :library-dependencies [[cylon "0.5.0-20141014.130020-17"]]
     :constructor cylon.impl.user/new-user-domain-seeder
     :args [:users [{:id "dev" :password {{{dev-password}}} }]]
     :dev? true
     }

  #_{:component :modular.web-template/dependency-dynamic-template-model
     :library-dependencies [[juxt.modular/template "0.6.0"]
                            [de.ubercode.clostache/clostache "1.3.1"]]
     :constructor modular.web-template/new-dependency-dynamic-template-model
     }

  ;; Project-local components
  {:component :website
   :library-dependencies [[hiccup "1.0.5"]
                          [juxt.modular/bidi "0.9.1"]]
   :constructor {{name}}.website/new-website
   :using [:template-model]}


   :library-dependencies [[juxt.modular/http-kit-events "0.6.0"]]
   :constructor modular.http-kit.events/new-event-service}

  {:component :modular.email/log-emailer
   :library-dependencies [[juxt.modular/email "0.0.1"]]
   :constructor modular.email.log-emailer/new-log-emailer}

  ;; Menus
  #_{:component :modular.menu/menu-index
     :library-dependencies [[juxt.modular/menu "0.5.3"]]
