diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.1.1.3
+version: 0.1.1.4
 cabal-version: >=1.10
 license: MIT
 license-file: LICENSE
@@ -17,6 +17,10 @@
   type:         git
   location:     https://github.com/ghcjs/jsaddle
 
+flag ghcjs
+    description: Tell cabal we are using ghcjs (work around until hackage supports impl(ghcjs))
+    default: True
+  
 flag gtk3
     Description: Use GTK3 rather than GTK2
     Default: True
@@ -35,11 +39,12 @@
 
 library
 --    if impl(ghcjs) && flag(jsffi)
---        cpp-options: -DUSE_JAVASCRIPTFFI
---        build-depends: ghcjs-base
+    if flag(ghcjs) && flag(jsffi)
+        cpp-options: -DUSE_JAVASCRIPTFFI
+        build-depends: ghcjs-base
 
 --    if !impl(ghcjs) || flag(webkit)
-    if impl(ghc)
+    if !flag(ghcjs) || flag(webkit)
         cpp-options: -DUSE_WEBKIT
         if flag(gtk3)
             build-depends: webkitgtk3 >=0.12.5 && <0.13,
@@ -73,11 +78,12 @@
         buildable: False
 
 --    if impl(ghcjs) && flag(jsffi)
---        cpp-options: -DUSE_JAVASCRIPTFFI
---        build-depends: ghcjs-base
+    if flag(ghcjs) && flag(jsffi)
+        cpp-options: -DUSE_JAVASCRIPTFFI
+        build-depends: ghcjs-base
 
 --    if !impl(ghcjs) || flag(webkit)
-    if impl(ghc)
+    if !flag(ghcjs) || flag(webkit)
         cpp-options: -DUSE_WEBKIT
         build-depends: glib >=0.12.3.1 && <0.13
         if flag(gtk3)
@@ -94,7 +100,7 @@
 
     build-depends: template-haskell -any, base <5, lens >=3.8.5 && <4.1,
                    text >=0.11.2.3 && <1.2, transformers >=0.3.0.0 && <0.4,
-                   hslogger -any, jsaddle ==0.1.1.3
+                   hslogger -any, jsaddle ==0.1.1.4
     type: exitcode-stdio-1.0
     main-is: TestJSaddle.hs
     default-language: Haskell2010
diff --git a/src/Language/Javascript/JSaddle.hs b/src/Language/Javascript/JSaddle.hs
--- a/src/Language/Javascript/JSaddle.hs
+++ b/src/Language/Javascript/JSaddle.hs
@@ -55,27 +55,17 @@
   --   will be replaced with JavaScript function calls.
 
   -- * Modules
-    module Language.Javascript.JSaddle.Monad
-  , module Language.Javascript.JSaddle.Exception
-  , module Language.Javascript.JSaddle.Value
-  , module Language.Javascript.JSaddle.Arguments
-  , module Language.Javascript.JSaddle.Properties
-  , module Language.Javascript.JSaddle.Object
-  , module Language.Javascript.JSaddle.Evaluate
-#ifdef MIN_VERSION_jmacro
-  , module Language.Javascript.JSaddle.JMacro
-#endif
-  , module Language.Javascript.JSaddle.String
+    module JSaddle
 ) where
 
-import Language.Javascript.JSaddle.Monad
-import Language.Javascript.JSaddle.Exception
-import Language.Javascript.JSaddle.Value
-import Language.Javascript.JSaddle.Arguments
-import Language.Javascript.JSaddle.Properties
-import Language.Javascript.JSaddle.Object
-import Language.Javascript.JSaddle.Evaluate
+import Language.Javascript.JSaddle.Monad as JSaddle
+import Language.Javascript.JSaddle.Exception as JSaddle
+import Language.Javascript.JSaddle.Value as JSaddle
+import Language.Javascript.JSaddle.Arguments as JSaddle
+import Language.Javascript.JSaddle.Properties as JSaddle
+import Language.Javascript.JSaddle.Object as JSaddle
+import Language.Javascript.JSaddle.Evaluate as JSaddle
 #ifdef MIN_VERSION_jmacro
-import Language.Javascript.JSaddle.JMacro
+import Language.Javascript.JSaddle.JMacro as JSaddle
 #endif
-import Language.Javascript.JSaddle.String
+import Language.Javascript.JSaddle.String as JSaddle
diff --git a/src/Language/Javascript/JSaddle/Evaluate.hs b/src/Language/Javascript/JSaddle/Evaluate.hs
--- a/src/Language/Javascript/JSaddle/Evaluate.hs
+++ b/src/Language/Javascript/JSaddle/Evaluate.hs
@@ -53,7 +53,7 @@
                -> JSM JSValueRef
 #if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
 evaluateScript script this url line = liftIO $ js_eval (makeStringRef script)
-foreign import javascript unsafe "$r = eval(s);"
+foreign import javascript unsafe "$r = eval($1);"
     js_eval :: JSStringRef -> IO JSValueRef
 #elif defined(USE_WEBKIT)
 evaluateScript script this url line = do
diff --git a/src/Language/Javascript/JSaddle/Exception.hs b/src/Language/Javascript/JSaddle/Exception.hs
--- a/src/Language/Javascript/JSaddle/Exception.hs
+++ b/src/Language/Javascript/JSaddle/Exception.hs
@@ -30,6 +30,6 @@
 
 -- | Catch JavaScript exceptions and rethrow Haskell ones
 rethrow :: (JSValueRefRef -> JSM a) -> JSM a
-rethrow f = f `catchval` \e -> do
+rethrow f = f `catchval` \e ->
     liftIO . E.throwIO $ JSException e
 
diff --git a/src/Language/Javascript/JSaddle/Monad.hs b/src/Language/Javascript/JSaddle/Monad.hs
--- a/src/Language/Javascript/JSaddle/Monad.hs
+++ b/src/Language/Javascript/JSaddle/Monad.hs
@@ -70,7 +70,7 @@
 catchval :: (JSValueRefRef -> JSM a) -> (JSValueRef -> JSM a) -> JSM a
 catchval f catcher = do
 #if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
-    pexc <- liftIO $ newArray
+    pexc <- liftIO newArray
     result <- f pexc
     exc <- liftIO $ indexArray 0 pexc
     if isUndefined exc || isNull exc
diff --git a/src/Language/Javascript/JSaddle/Object.hs b/src/Language/Javascript/JSaddle/Object.hs
--- a/src/Language/Javascript/JSaddle/Object.hs
+++ b/src/Language/Javascript/JSaddle/Object.hs
@@ -81,7 +81,7 @@
 import Foreign.C.Types (CSize(..), CULong(..), CUInt(..))
 #if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
 import GHCJS.Types (nullRef, castRef, JSArray, JSFun)
-import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2)
+import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2, ForeignRetention(..))
 import Control.Monad (liftM)
 import Control.Applicative ((<$>))
 #else
@@ -264,6 +264,9 @@
 
 -- | Use this to create a new JavaScript object
 --
+-- If you pass more than 7 arguments to a constructor for a built in
+-- JavaScript type (like Date) then this function will fail.
+--
 -- >>> testJSaddle $ new "Date" (2013, 1, 1)
 -- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
 new :: (MakeObjectRef constructor, MakeArgRefs args)
@@ -333,7 +336,7 @@
                              --   call the Haskell one when it is called
 #if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
 function name f = liftIO $ do
-    callback <- syncCallback2 False True $ \this args -> do
+    callback <- syncCallback2 NeverRetain True $ \this args -> do
         rargs <- fromArray args
         runReaderT (f this this rargs) () -- TODO pass function object through
     makeFunctionWithCallback (makeStringRef name) callback
@@ -362,17 +365,17 @@
 --   a name.
 instance MakeValueRef JSCallAsFunction where
 #if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
-    makeValueRef = function (nullRef::JSStringRef)
+    makeValueRef = function (nullRef:: JSStringRef)
 #else
-    makeValueRef = function (nullPtr::JSStringRef)
+    makeValueRef = function (nullPtr:: JSStringRef)
 #endif
 
 instance MakeArgRefs JSCallAsFunction where
     makeArgRefs f = do
 #if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
-        rarg <- function (nullRef::JSStringRef) f
+        rarg <- function (nullRef:: JSStringRef) f
 #else
-        rarg <- function (nullPtr::JSStringRef) f
+        rarg <- function (nullPtr:: JSStringRef) f
 #endif
         return [rarg]
 
@@ -473,6 +476,9 @@
 #endif
 
 -- | Call a JavaScript object as a constructor. Consider using 'new'.
+--
+-- If you pass more than 7 arguments to a constructor for a built in
+-- JavaScript type (like Date) then this function will fail.
 objCallAsConstructor :: MakeArgRefs args
                      => JSObjectRef
                      -> args
@@ -485,22 +491,25 @@
 foreign import javascript unsafe "\
     try {\
         switch($2.length) {\
-            case 0 : $r = new $1();\
-            case 1 : $r = new $1($2[0]);\
-            case 2 : $r = new $1($2[0],$2[1]);\
-            case 3 : $r = new $1($2[0],$2[1],$2[2]);\
-            case 4 : $r = new $1($2[0],$2[1],$2[2],$2[3]);\
-            case 5 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4]);\
-            case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]);\
-            case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]);\
+            case 0 : $r = new $1(); break;\
+            case 1 : $r = new $1($2[0]); break;\
+            case 2 : $r = new $1($2[0],$2[1]); break;\
+            case 3 : $r = new $1($2[0],$2[1],$2[2]); break;\
+            case 4 : $r = new $1($2[0],$2[1],$2[2],$2[3]); break;\
+            case 5 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4]); break;\
+            case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]); break;\
+            case 7 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]); break;\
             default:\
                 var ret;\
                 var temp = function() {\
                     ret = $1.apply(this, $2);\
                 };\
-                temp.prototype = f.prototype;\
+                temp.prototype = $1.prototype;\
                 var i = new temp();\
-                $r = ret instanceof Object ? ret : i;\
+                if(ret instanceof Object)\
+                    return ret;\
+                i.constructor = $1;\
+                return i;\
         }\
     }\
     catch(e) {\
