diff --git a/django/template/__init__.py b/django/template/__init__.py
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -876,7 +876,7 @@ class DebugVariableNode(VariableNode):
         else:
             return output
 
-def generic_tag_compiler(params, defaults, name, node_class, parser, token):
+def generic_tag_compiler(init, params, defaults, name, node_class, parser, token):
     "Returns a template.Node subclass."
     bits = token.split_contents()[1:]
     bmax = len(params)
@@ -888,7 +888,43 @@ def generic_tag_compiler(params, default
         else:
             message = "%s takes between %s and %s arguments" % (name, bmin, bmax)
         raise TemplateSyntaxError, message
-    return node_class(bits)
+    return node_class(bits, **init)
+
+class SimpleNode(Node):
+    def __init__(self, vars_to_resolve, func):
+        self.vars_to_resolve = map(Variable, vars_to_resolve)
+        self.func = func
+
+    def render(self, context):
+        resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
+        return self.func(*resolved_vars)
+
+class InclusionNode(Node):
+    def __init__(self, vars_to_resolve, file_name, context_class, takes_context, func):
+        self.vars_to_resolve = map(Variable, vars_to_resolve)
+        self.file_name = file_name
+        self.context_class = context_class
+        self.takes_context = takes_context
+        self.func = func
+
+    def render(self, context):
+        resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
+        if self.takes_context:
+            args = [context] + resolved_vars
+        else:
+            args = resolved_vars
+
+        dict = self.func(*args)
+
+        if not getattr(self, 'nodelist', False):
+            from django.template.loader import get_template, select_template
+            if not isinstance(self.file_name, basestring) and is_iterable(self.file_name):
+                t = select_template(self.file_name)
+            else:
+                t = get_template(self.file_name)
+            self.nodelist = t.nodelist
+        return self.nodelist.render(self.context_class(dict,
+                autoescape=context.autoescape))
 
 class Library(object):
     def __init__(self):
@@ -946,15 +982,7 @@ class Library(object):
     def simple_tag(self,func):
         params, xx, xxx, defaults = getargspec(func)
 
-        class SimpleNode(Node):
-            def __init__(self, vars_to_resolve):
-                self.vars_to_resolve = map(Variable, vars_to_resolve)
-
-            def render(self, context):
-                resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
-                return func(*resolved_vars)
-
-        compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, SimpleNode)
+        compile_func = curry(generic_tag_compiler, {"func": func}, params, defaults, getattr(func, "_decorated_function", func).__name__, SimpleNode)
         compile_func.__doc__ = func.__doc__
         self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
         return func
@@ -968,30 +996,8 @@ class Library(object):
                 else:
                     raise TemplateSyntaxError, "Any tag function decorated with takes_context=True must have a first argument of 'context'"
 
-            class InclusionNode(Node):
-                def __init__(self, vars_to_resolve):
-                    self.vars_to_resolve = map(Variable, vars_to_resolve)
-
-                def render(self, context):
-                    resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
-                    if takes_context:
-                        args = [context] + resolved_vars
-                    else:
-                        args = resolved_vars
-
-                    dict = func(*args)
-
-                    if not getattr(self, 'nodelist', False):
-                        from django.template.loader import get_template, select_template
-                        if not isinstance(file_name, basestring) and is_iterable(file_name):
-                            t = select_template(file_name)
-                        else:
-                            t = get_template(file_name)
-                        self.nodelist = t.nodelist
-                    return self.nodelist.render(context_class(dict,
-                            autoescape=context.autoescape))
-
-            compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
+            init = {"file_name": file_name, "context_class": context_class, "takes_context": takes_context, "func": func}
+            compile_func = curry(generic_tag_compiler, init, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
             compile_func.__doc__ = func.__doc__
             self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
             return func
