Added futures support to mako

Provide a list of names to import from __future__ to Template or
TemplateLookup, and it will render the import from __future__
statement at the top of the generated code so that it actually works.
diff --git a/mako/codegen.py b/mako/codegen.py
index 6c54892..714d6ae 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -25,6 +25,7 @@
                 default_filters=None,
                 buffer_filters=None,
                 imports=None,
+                future_imports=None,
                 source_encoding=None,
                 generate_magic_comment=True,
                 disable_unicode=False,
@@ -52,6 +53,7 @@
                                             default_filters,
                                             buffer_filters,
                                             imports,
+                                            future_imports,
                                             source_encoding,
                                             generate_magic_comment,
                                             disable_unicode,
@@ -68,6 +70,7 @@
                     default_filters,
                     buffer_filters,
                     imports,
+                    future_imports,
                     source_encoding,
                     generate_magic_comment,
                     disable_unicode,
@@ -79,6 +82,7 @@
         self.default_filters = default_filters
         self.buffer_filters = buffer_filters
         self.imports = imports
+        self.future_imports = future_imports
         self.source_encoding = source_encoding
         self.generate_magic_comment = generate_magic_comment
         self.disable_unicode = disable_unicode
@@ -187,6 +191,10 @@
             self.printer.writeline("# -*- encoding:%s -*-" %
                                     self.compiler.source_encoding)
 
+        if self.compiler.future_imports:
+            # FIXME: this should only import the future features requested
+            self.printer.writeline("from __future__ import %s" %
+                                   (", ".join(self.compiler.future_imports),))
         self.printer.writeline("from mako import runtime, filters, cache")
         self.printer.writeline("UNDEFINED = runtime.UNDEFINED")
         self.printer.writeline("__M_dict_builtin = dict")
diff --git a/mako/lookup.py b/mako/lookup.py
index 4d86696..023b6d0 100644
--- a/mako/lookup.py
+++ b/mako/lookup.py
@@ -171,7 +171,8 @@
                         imports=None,
                         enable_loop=True,
                         input_encoding=None,
-                        preprocessor=None):
+                        preprocessor=None,
+                        futures=False):
 
         self.directories = [posixpath.normpath(d) for d in
                             util.to_list(directories, ())
@@ -209,7 +210,8 @@
             'strict_undefined':strict_undefined,
             'imports':imports,
             'enable_loop':enable_loop,
-            'preprocessor':preprocessor}
+            'preprocessor':preprocessor,
+            'futures': futures}
 
         if collection_size == -1:
             self._collection = {}
diff --git a/mako/template.py b/mako/template.py
index b069139..4e99d9f 100644
--- a/mako/template.py
+++ b/mako/template.py
@@ -216,7 +216,8 @@
                     strict_undefined=False,
                     imports=None,
                     enable_loop=True,
-                    preprocessor=None):
+                    preprocessor=None,
+                    futures=None):
         if uri:
             self.module_id = re.sub(r'\W', "_", uri)
             self.uri = uri
@@ -247,6 +248,7 @@
         self.enable_loop = enable_loop
         self.strict_undefined = strict_undefined
         self.module_writer = module_writer
+        self.futures = futures
 
         if util.py3k and disable_unicode:
             raise exceptions.UnsupportedError(
@@ -306,6 +308,7 @@
             cache_impl, cache_enabled, cache_args,
             cache_type, cache_dir, cache_url
         )
+      
 
     @util.memoized_property
     def reserved_names(self):
@@ -601,6 +604,7 @@
                             default_filters=template.default_filters,
                             buffer_filters=template.buffer_filters,
                             imports=template.imports,
+                            future_imports=template.futures,
                             source_encoding=lexer.encoding,
                             generate_magic_comment=generate_magic_comment,
                             disable_unicode=template.disable_unicode,
diff --git a/test/test_template.py b/test/test_template.py
index 03bcf09..e6fa3c6 100644
--- a/test/test_template.py
+++ b/test/test_template.py
@@ -1240,3 +1240,10 @@
 """, preprocessor=convert_comments)
 
         assert flatten_result(t.render()) == "im a template - # not a comment - ## not a comment"
+
+
+class FuturesTest(TemplateTest):
+
+    def test_future_import(self):
+        t = Template("${ x / y }", futures=["division"])
+        assert result_lines(t.render(x=12, y=5)) == ["2.4"]