 ;; (mapcar #'ngender-normalize-feature
 ;;  '(foo "foo" 'foo ("foo" bar) '("foo" bar)) )
 
+;; ** ngender require, load, provide with macros
+
+(defvar *ngender-modules-loaded* '() "assoc list of (module features...) already loaded")
+
+(defvar *ngender-modules-loading* '() "assoc stack of (module features...) being loaded")
+
+;; We're loading, push us on the stack!
+(setq *ngender-modules-loading* (cons (ngender-normalize-feature "ngender") *ngender-modules-loading*))
+
 (defun ngender-forget-loading (module)
 	"remove all instances of given module from list of modules in process of loading"
-	(if-let ( (module (ngender-normalize-module module)) )
-		(setq *ngender-modules-loading* (assoc-delete-all module *ngender-modules-loading*) ) ) )
+	(let ( (module (ngender-normalize-module module)) )
+		(when module
+			(setq *ngender-modules-loading* (ngender-assoc-delete-all module *ngender-modules-loading*) ) ) ) )
 
 (defun ngender-forget-loaded (module)
 	"remove all instances of given module from list of modules already loaded"
-	(if-let ( (module (ngender-normalize-module module)) )
-		(setq *ngender-modules-loaded* (assoc-delete-all module *ngender-modules-loaded*)) ) )
+	(let ( (module (ngender-normalize-module module)) )
+		(when module
+			(setq *ngender-modules-loaded* (ngender-assoc-delete-all module *ngender-modules-loaded*)) ) ) )
 
 (defun ngender-loading (module)
 	"return the (module feature...) list requested for the given module being loaded"
-	(if-let ( (module (ngender-normalize-module module)) )
-		(assoc module *ngender-modules-loading*) ) )
+	(let ( (module (ngender-normalize-module module)) )
+		(when module
+			(assoc module *ngender-modules-loading*) ) ) )
 
 (defmacro ngender-features (module)
 	"provide just the feature list, leaving off the module name"

;; (macroexpand-1 '(ngender foo this that))

(defmacro ngender-provide (module)
	(list 'ngender-provide-function (list 'quote module)) )

;; (macroexpand-1 '(ngender-provide foo))

(defmacro ngender-forget (module)
	"fagedaboutit"
	(if-let ( (module (ngender-normalize-module module)) )
		`(progn
			 (ngender-forget-loading ,module)
			 (ngender-forget-loaded ,module) )
		`(ngender-warn 'module "a module name") ) )

;; (macroexpand-1 '(ngender-forget foo))


		(cond
			( (consp a) (let* ( (pair (ngender-archive-p a)) )
										(if (not pair)
											(warn "expected archive: %s" a)
											(ngender-add-package-archive-pair '*ngender-known-package-archives* pair)
											(ngender-add-package-archive-pair 'package-archives pair) ) ) )
			( (or (stringp a) (symbolp a)) (ngender-add-package-archive-by-key a) )
			( t (warn "expected archive name or pair %s" a) ) ) ) )


(defmacro ngender-archive (&rest archives)
