diff --git a/src/Twitch.hs b/src/Twitch.hs
--- a/src/Twitch.hs
+++ b/src/Twitch.hs
@@ -73,12 +73,18 @@
   , delete
   , addModify
   , name
-  -- Running as a library
+  -- * Advanced Main
+  , Options (..)
+  , defaultMainWithOptions
+  -- * Running as a library
+  , Config (..)
   , run
+  , runWithConfig
   -- * Extra
   , DepM
   ) where
 import Twitch.Internal 
+import Twitch.InternalRule (Config (..))
 import Twitch.Main
 import Twitch.Run
 import Twitch.Rule (Rule, RuleAction, Name, PatternText)
diff --git a/src/Twitch/Internal.hs b/src/Twitch/Internal.hs
--- a/src/Twitch/Internal.hs
+++ b/src/Twitch/Internal.hs
@@ -60,30 +60,62 @@
 infixl 8 |+, |%, |-, |>, |#
 (|+), (|%), (|-), (|>) :: Dep -> (FilePath -> IO a) -> Dep
 -- | Add a \'add\' callback
+--   ex.
+--
+--   > "*.png" |+ addToManifest
 x |+ f = modHeadRule x $ Rule.addF f
 -- | Add a \'modify\' callback
+--   ex.
+--
+--   > "*.c" |% [s|gcc -o$directory$basename.o $path|]
 x |% f = modHeadRule x $ Rule.modifyF f
 -- | Add a \'delete' callback
+--   ex.
+--
+--   > "*.c" |- [s|gcc -o$directory$basename.o $path|]
 x |- f = modHeadRule x $ Rule.deleteF f
 -- | Add the same callback for the \'add\' and the \'modify\' events.
+--   ex.
+--
+--   > "*.md" |> [s|pandoc -t html $path|]
+--   
+--   Defined as: x '|>' f = x '|+' f '|%' f
 x |> f = x |+ f |% f
 
 -- | Set the name of a rule. Useful for debugging when logging is enabled.
 --   Rules names default to the glob pattern.
+--   ex.
+--
+--   > "*.md" |> [s|pandoc -t html $path|] |# "markdown to html"
 (|#) :: Dep -> Text -> Dep
 r |# p = modHeadRule r $ Rule.nameF p
 
 -- Prefix API -----------------------------------------------------------------
 add, modify, delete, addModify :: (FilePath -> IO a) -> Dep -> Dep
 -- | Add a \'add\' callback
+--   ex.
+--
+--   > add addToManifest "*.png"
 add      = flip (|+)
 -- | Add a \'modify\' callback
+--   ex.
+--
+--   > mod [s|gcc -o$directory$basename.o $path|] "*.c"
 modify   = flip (|%)
 -- | Add a \'delete' callback
+--   ex.
+--
+--   > delete [s|gcc -o$directory$basename.o $path|] "*.c"
 delete   = flip (|-)
 -- | Add the same callback for the \'add\' and the \'modify\' events.
+--   ex.
+--
+--   > addModify [s|pandoc -t html $path|] "*.md" 
 addModify = flip (|>)
 -- | Set the name of a rule. Useful for debugging when logging is enabled.
 --   Rules names default to the glob pattern.
+--   ex.
+--
+--   > name "markdown to html" $ addModify [s|pandoc -t html $path|] "*.md"
 name :: Text -> Dep -> Dep
 name = flip (|#)
diff --git a/src/Twitch/InternalRule.hs b/src/Twitch/InternalRule.hs
--- a/src/Twitch/InternalRule.hs
+++ b/src/Twitch/InternalRule.hs
@@ -66,9 +66,9 @@
 
 -- | Configuration to run the file watcher
 data Config = Config 
-  { log         :: Issue -> IO ()
+  { logger      :: Issue -> IO ()
   -- ^ A logger for the issues 
-  , dirsToWatch :: [FilePath]
+  , dirs        :: [FilePath]
   -- ^ The directories to watch
   , watchConfig :: WatchConfig
   -- ^ config for the file watcher
@@ -77,13 +77,13 @@
 instance Show Config where
   show Config {..} 
     =  "Config { dirsToWatch = " 
-    ++ show dirsToWatch
+    ++ show dirs
     ++ "}"
 
 instance Default Config where
   def = Config
-    { log         = def
-    , dirsToWatch = def
+    { logger      = def
+    , dirs        = def
     , watchConfig = defaultConfig
     }
     
@@ -121,7 +121,7 @@
 testAndFireRule Config {..} event rule = do
   let shouldFire = fileTest rule (filePath event) (time event)
   when shouldFire $ do 
-    log $ IRuleFired event rule
+    logger $ IRuleFired event rule
     fireRule event rule 
 
 -- TODO in the future this should use the recursive directory functions
@@ -131,13 +131,12 @@
 setupRuleForDir config@(Config {..}) man rules dirPath = do
   -- TODO Instead of const True, this should use the rule's fileTests
   void $ watchDir man dirPath (const True) $ \event -> do 
-    print event
-    log $ IEvent event
+    logger $ IEvent event
     forM_ rules $ testAndFireRule config event
 
 -- | Setup all of the directory watches using the rules
 setupRules :: Config -> [InternalRule] -> IO WatchManager
 setupRules config@(Config {..}) rules = do 
   man <- startManagerConf watchConfig
-  forM_ dirsToWatch $ setupRuleForDir config man rules
+  forM_ dirs $ setupRuleForDir config man rules
   return man
diff --git a/src/Twitch/Main.hs b/src/Twitch/Main.hs
--- a/src/Twitch/Main.hs
+++ b/src/Twitch/Main.hs
@@ -176,8 +176,8 @@
         }
   
   let config = IR.Config
-        { log         = logger
-        , dirsToWatch = dirsToWatch''
+        { logger      = logger
+        , dirs        = dirsToWatch''
         , watchConfig = watchConfig
         }
   return (currentDir', config, mhandle)
@@ -192,11 +192,19 @@
        <> progDesc "Print a greeting for TARGET"
        <> header "hello - a test for optparse-applicative" 
         )
-  (currentDir, config, mhandle) <- optionsToConfig =<< execParser opts
+  options <- execParser opts
+  defaultMainWithOptions options dep
+
+-- | A main file that uses manually supplied options instead of parsing the passed in arguments.
+defaultMainWithOptions :: Options -> Dep -> IO ()
+defaultMainWithOptions options dep = do
+  (currentDir, config, mhandle) <- optionsToConfig options
   let currentDir' = F.decodeString currentDir
   manager <- runWithConfig currentDir' config dep 
   putStrLn "Type anything to quit"
   _ <- getLine
   for_ mhandle hClose
   FS.stopManager manager
+  
+
   
diff --git a/src/Twitch/Rule.hs b/src/Twitch/Rule.hs
--- a/src/Twitch/Rule.hs
+++ b/src/Twitch/Rule.hs
@@ -66,6 +66,9 @@
 infixl 8 |+, |%, |-, |>, |#
 (|+), (|%), (|-), (|>) :: Rule -> (FilePath -> IO a) -> Rule
 -- | Set the 'add' field
+--   ex.
+-- 
+--   > "doodle.md |+ ringBell "
 x |+ f = x { add = void . f }
 -- | Set the modify field
 x |% f = x { modify = void . f }
diff --git a/src/Twitch/Run.hs b/src/Twitch/Run.hs
--- a/src/Twitch/Run.hs
+++ b/src/Twitch/Run.hs
@@ -19,7 +19,7 @@
 run dep =  do
   currentDir <- decodeString <$> getCurrentDirectory
   dirs       <- findAllDirs currentDir
-  runWithConfig currentDir (def { log = print, dirsToWatch = dirs }) dep
+  runWithConfig currentDir (def { logger = print, dirs = dirs }) dep
 
 runWithConfig :: FilePath -> Config -> Dep -> IO WatchManager
 runWithConfig currentDir config dep = do
diff --git a/twitch.cabal b/twitch.cabal
--- a/twitch.cabal
+++ b/twitch.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                twitch
-version:             0.1.2.2
+version:             0.1.3.0
 synopsis:            A high level file watcher DSL
 description: 
  Twitch is a monadic DSL and library for file watching. 
