Added hooks for compilation and generation.  This fixes #384

--HG--
branch : trunk
diff --git a/jinja2/environment.py b/jinja2/environment.py
index 03aef1a..c8abd51 100644
--- a/jinja2/environment.py
+++ b/jinja2/environment.py
@@ -433,6 +433,22 @@
                 stream = TokenStream(stream, name, filename)
         return stream
 
+    def _generate(self, source, name, filename, defer_init=False):
+        """Internal hook that can be overriden to hook a different generate
+        method in.
+
+        .. versionadded:: 2.5
+        """
+        return generate(source, self, name, filename, defer_init=defer_init)
+
+    def _compile(self, source, filename):
+        """Internal hook that can be overriden to hook a different compile
+        method in.
+
+        .. versionadded:: 2.5
+        """
+        return compile(source, filename, 'exec')
+
     @internalcode
     def compile(self, source, name=None, filename=None, raw=False,
                 defer_init=False):
@@ -462,15 +478,15 @@
                 source = self._parse(source, name, filename)
             if self.optimized:
                 source = optimize(source, self)
-            source = generate(source, self, name, filename,
-                              defer_init=defer_init)
+            source = self._generate(source, name, filename,
+                                    defer_init=defer_init)
             if raw:
                 return source
             if filename is None:
                 filename = '<template>'
             else:
                 filename = _encode_filename(filename)
-            return compile(source, filename, 'exec')
+            return self._compile(source, filename)
         except TemplateSyntaxError:
             exc_info = sys.exc_info()
         self.handle_exception(exc_info, source_hint=source)
@@ -589,7 +605,7 @@
                 filename = ModuleLoader.get_module_filename(name)
 
                 if py_compile:
-                    c = compile(code, _encode_filename(filename), 'exec')
+                    c = self._compile(code, _encode_filename(filename))
                     write_file(filename + 'c', py_header +
                                marshal.dumps(c), 'wb')
                     log_function('Byte-compiled "%s" as %s' %