diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,8 @@
+1.0 (2013/01/23)
+ - Changed type of transformer from [Ast] -> [Ast] to [Ast] -> IO [Ast]
+   (as suggested by John MacFarlane)
+ - Cleaned up some warnings.
+
 0.1.2 (2011/01/30)
  - Updated for GHC 7 (Thanks to Yusaku HASHIMOTO)
 
diff --git a/Language/Haskell/Preprocessor.hs b/Language/Haskell/Preprocessor.hs
--- a/Language/Haskell/Preprocessor.hs
+++ b/Language/Haskell/Preprocessor.hs
@@ -15,6 +15,7 @@
 import System.Environment (getProgName)
 import System.Exit (exitFailure)
 import Control.Exception (bracket)
+import Control.Monad ((<=<))
 
 import Data.Monoid (Monoid(..))
 import qualified Control.Monad.Writer as W
@@ -29,7 +30,7 @@
 
 data Extension = Extension {
                    keywords    :: [[Keyword]],
-                   transformer :: [Ast] -> [Ast],
+                   transformer :: [Ast] -> IO [Ast],
                    synspec     :: SynSpec,
                    usage       :: Maybe (IO ()),
                    syntaxerror :: Maybe (E.Error -> IO ())
@@ -38,14 +39,14 @@
 instance Monoid Extension where
   mempty          = Extension {
                       keywords    = [],
-                      transformer = id,
+                      transformer = return,
                       synspec     = mempty,
                       usage       = Nothing,
                       syntaxerror = Nothing
                     }
   e1 `mappend` e2 = Extension {
                       keywords    = keywords e1 ++ keywords e2,
-                      transformer = transformer e1 . transformer e2,
+                      transformer = transformer e1 <=< transformer e2,
                       synspec     = synspec e1 `mappend` synspec e2,
                       usage       = usage e1       <+ usage e2,
                       syntaxerror = syntaxerror e1 <+ syntaxerror e2
@@ -56,7 +57,7 @@
 base :: Extension
 base  = Extension {
           keywords    = [],
-          transformer = id,
+          transformer = return,
           synspec     = defaultSpec,
           usage       = Just (do
             prog <- getProgName
@@ -82,7 +83,7 @@
                       Nothing -> return ()
                     exitFailure
       Right r -> return r
-    let result = transformer extension asts
+    result <- transformer extension asts
     case files of
       [_, _, file] -> fileDump spec file result
       _            -> stdoutDump spec result
diff --git a/Language/Haskell/Preprocessor/Ast.hs b/Language/Haskell/Preprocessor/Ast.hs
--- a/Language/Haskell/Preprocessor/Ast.hs
+++ b/Language/Haskell/Preprocessor/Ast.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 module Language.Haskell.Preprocessor.Ast (
   Ast(..), flatten, flattenList, format, cons,
   module Language.Haskell.Preprocessor.Token
diff --git a/Language/Haskell/Preprocessor/Error.hs b/Language/Haskell/Preprocessor/Error.hs
--- a/Language/Haskell/Preprocessor/Error.hs
+++ b/Language/Haskell/Preprocessor/Error.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 module Language.Haskell.Preprocessor.Error (
   Error(..), fromParseError, errorAt
 ) where
diff --git a/Language/Haskell/Preprocessor/Loc.hs b/Language/Haskell/Preprocessor/Loc.hs
--- a/Language/Haskell/Preprocessor/Loc.hs
+++ b/Language/Haskell/Preprocessor/Loc.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 module Language.Haskell.Preprocessor.Loc (
   Loc, file, line, col,
   initial, bogus, isBogus,
diff --git a/Language/Haskell/Preprocessor/Token.hs b/Language/Haskell/Preprocessor/Token.hs
--- a/Language/Haskell/Preprocessor/Token.hs
+++ b/Language/Haskell/Preprocessor/Token.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 module Language.Haskell.Preprocessor.Token (
   Token(..), Tag(..), newToken
 ) where
diff --git a/preprocessor-tools.cabal b/preprocessor-tools.cabal
--- a/preprocessor-tools.cabal
+++ b/preprocessor-tools.cabal
@@ -1,12 +1,12 @@
 Name:           preprocessor-tools
-Version:        0.1.3
+Version:        1.0
 Cabal-Version:  >= 1.2.3
 License:        BSD3
 License-File:   LICENSE
 Stability:      experimental
-Author:         Jesse A. Tov <tov@ccs.neu.edu>
-Maintainer:     tov@ccs.neu.edu
-Homepage:       http://www.ccs.neu.edu/~tov/pubs/haskell-session-types
+Author:         Jesse A. Tov <tov@eecs.harvard.edu>
+Maintainer:     tov@eecs.harvard.edu
+Homepage:       http://www.eecs.harvard.edu/~tov/pubs/haskell-session-types/
 Category:       Source-tools, Language, Code Generation
 Synopsis:       A framework for extending Haskell's syntax via quick-and-dirty preprocessors
 Build-type:     Simple
@@ -31,7 +31,6 @@
                         base >=4 && <5,
                         syb >=0 && <1
 
-  Extensions:           DeriveDataTypeable
   Exposed-modules:
     Language.Haskell.Preprocessor,
     Language.Haskell.Preprocessor.Ast,
@@ -44,3 +43,4 @@
     Language.Haskell.Preprocessor.Util
   Other-modules:
     Language.Haskell.Preprocessor.Lexer
+  GHC-options: -Wall
