improved variable exporting, added TODO file

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index cf0f4a5..cb0da5a 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -43,6 +43,7 @@
     """Generate the python source for a node tree."""
     if not isinstance(node, nodes.Template):
         raise TypeError('Can\'t compile non template nodes')
+    node.freeze()
     generator = CodeGenerator(environment, name, filename, stream)
     generator.visit(node)
     if stream is None:
@@ -1138,10 +1139,25 @@
 
         # make sure toplevel assignments are added to the context.
         if frame.toplevel:
-            for name in assignment_frame.assigned_names:
+            public_names = [x for x in assignment_frame.assigned_names
+                            if not x.startswith('__')]
+            if len(assignment_frame.assigned_names) == 1:
+                name = iter(assignment_frame.assigned_names).next()
                 self.writeline('context.vars[%r] = l_%s' % (name, name))
-                if not name.startswith('__'):
-                    self.writeline('context.exported_vars.add(%r)' % name)
+            else:
+                self.writeline('context.vars.update({')
+                for idx, name in enumerate(assignment_frame.assigned_names):
+                    if idx:
+                        self.write(', ')
+                    self.write('%r: l_%s' % (name, name))
+                self.write('})')
+            if public_names:
+                if len(public_names) == 1:
+                    self.writeline('context.exported_vars.add(%r)' %
+                                   public_names[0])
+                else:
+                    self.writeline('context.exported_vars.update((%s))' %
+                                   ', '.join(map(repr, public_names)))
 
     def visit_Name(self, node, frame):
         if node.ctx == 'store' and frame.toplevel: