    express = require 'express'
    async = require 'async'
    readdirp = require 'readdirp'
    uuid = require 'node-uuid'
    connect = require 'connect'

    utils = require './utils'
    
    modulesAppPath = "#{process.cwd()}/server_modules"

    modulesRunner = 
      files: []
      fns: []
      befores: []
      afters: []

    expressApp = undefined

    serverStarting = (app, cb) -> 

      expressApp = app

      findModules () -> determineModuleTypes (indexModExists, indexMod) -> requireModules indexModExists, indexMod, () -> cb()
    
    serverStarted = () -> mod.after expressApp  for mod in modulesRunner.afters

    findModules = (cb) -> 

      utils.listFiles modulesAppPath, '.litcoffee', (files) -> 

        Array::push.apply modulesRunner.files, files

        cb()

    determineModuleTypes = (cb) ->

      indexModExists = false

      for mod in modulesRunner.files

        if mod.indexOf('index.litcoffee') isnt -1 and mod.replace("#{process.cwd()}/server_modules/", '').indexOf('/') is -1

          indexModExists = true 
          indexMod = require mod

          modulesRunner.afters.push indexMod  if typeof indexMod is 'object' and indexMod.after

        else

          if mod.replace("#{process.cwd()}/server_modules/", '').indexOf('/') is -1

            requiredMod = require mod

            modulesRunner.fns.push requiredMod  if typeof requiredMod is 'function'
            modulesRunner.befores.push requiredMod  if typeof requiredMod is 'object' and requiredMod.before
            modulesRunner.afters.push requiredMod  if typeof requiredMod is 'object' and requiredMod.after

      cb indexModExists, indexMod

Run `index` module first (if available), then run modules alphabetically. Assume `index` is not a _function_, and has _both_ `before` and `after` declared.

    requireModules = (indexModExists, indexMod, cb) ->

      runner = (done) -> runFunctionModules () -> runBeforeModules () -> done()

      if indexModExists

        indexMod.before expressApp, () -> runner cb

        return

      runner cb

`function` _Server Modules_.

    executeFnModule = (mod, cb) -> mod expressApp, cb

    runFunctionModules = (cb) -> async.every modulesRunner.fns, executeFnModule, () -> cb()

`before` _Server Modules_.

    executeBeforeModule = (mod, cb) -> mod.before expressApp, cb

    runBeforeModules = (cb) -> async.every modulesRunner.befores, executeBeforeModule, () -> cb()

## Public API ##

    publicFns = 
      serverStarting: serverStarting
      serverStarted: serverStarted

    module.exports = publicFns