=== modified file 'django/template/__init__.py'
--- django/template/__init__.py	2007-06-17 09:46:04 +0000
+++ django/template/__init__.py	2007-06-19 19:53:03 +0000
@@ -700,18 +700,23 @@
     return current
 
 class NodeBase(type):
+    """
+    Ensures that either a 'render' or 'render_iter' method is defined on
+    any Node sub-class. This avoids potential infinite loops at runtime.
+    """
     def __new__(cls, name, bases, attrs):
         """
-        Ensures that either a 'render' or 'render_iter' method is defined on
-        any Node sub-class. This avoids potential infinite loops at runtime.
+        iter_render/render checking, enabled form of __new__; initially disabled
         """
-        if not (isinstance(attrs.get('render'), types.FunctionType) or
-                isinstance(attrs.get('iter_render'), types.FunctionType)):
+        safeties_enabled = not attrs.pop("__disable_iter_render_safeties__", False)
+        new_cls = type.__new__(cls, name, bases, attrs)
+        if safeties_enabled and new_cls.render is Node.render and new_cls.iter_render is Node.iter_render:
             raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.')
-        return type.__new__(cls, name, bases, attrs)
+        return new_cls
 
 class Node(object):
     __metaclass__ = NodeBase
+    __disable_iter_render_safeties__ = True
 
     def iter_render(self, context):
         return (self.render(context),)
@@ -732,6 +737,7 @@
             nodes.extend(self.nodelist.get_nodes_by_type(nodetype))
         return nodes
 
+
 class NodeList(list):
     def render(self, context):
         return ''.join(self.iter_render(context))

