    {-# LANGUAGE ExistentialQuantification #-}
    {-# LANGUAGE OverloadedStrings         #-}

    ------------------------------------------------------------------------------
    -- |
    --
    -- This module contains all the central authentication functionality.
    --
    -- It exports a number of high-level functions to be used directly in your
    -- application handlers.
    --
    -- We also export a number of mid-level functions that should be helpful when
    -- you are integrating with another way of confirming the authentication of
    -- login requests.
    --

    module Snap.Snaplet.Auth
      (
      -- * Higher Level Handler Functions
        createUser
      , usernameExists
      , saveUser
      , destroyUser
      , loginByUsername
      , loginByRememberToken
      , forceLogin
      , logout
      , currentUser
      , isLoggedIn

      -- * Lower Level Functions
      , markAuthSuccess
      , markAuthFail
      , checkPasswordAndLogin

      -- * Types
      , AuthManager(..)
      , IAuthBackend(..)
      , AuthSettings(..)
      , defAuthSettings
      , AuthUser(..)
      , defAuthUser
      , UserId(..)
      , Password(..)
      , AuthFailure(..)
      , Role(..)

      -- * Other Utilities
      , authSettingsFromConfig
      , withBackend
      , encryptPassword
      , checkPassword
      , authenticatePassword
      , setPassword
      , encrypt
      , verify

      -- * Handlers
      , registerUser
      , loginUser
      , logoutUser
      , requireUser
      , setPasswordResetToken
      , clearPasswordResetToken

      -- * Splice helpers
      , addAuthSplices
      , compiledAuthSplices
      , userCSplices
      , userISplices
      , ifLoggedIn
      , ifLoggedOut
      , loggedInUser
      )
      where

    ------------------------------------------------------------------------------
    import Snap.Snaplet.Auth.AuthManager
    import Snap.Snaplet.Auth.Handlers
    import Snap.Snaplet.Auth.SpliceHelpers
    import Snap.Snaplet.Auth.Types