python 3 port: manual fixes, remove 2to3 from setup.py, remove fixers
diff --git a/jinja2/ext.py b/jinja2/ext.py
index 984a4d9..0652a34 100644
--- a/jinja2/ext.py
+++ b/jinja2/ext.py
@@ -16,7 +16,7 @@
 from jinja2.environment import Environment
 from jinja2.runtime import Undefined, concat
 from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError
-from jinja2.utils import contextfunction, import_string, Markup, next
+from jinja2.utils import contextfunction, import_string, Markup
 import six
 
 
@@ -35,7 +35,7 @@
         return rv
 
 
-class Extension(object):
+class Extension(six.with_metaclass(ExtensionRegistry, object)):
     """Extensions can be used to add extra functionality to the Jinja template
     system at the parser level.  Custom extensions are bound to an environment
     but may not store environment specific data on `self`.  The reason for
@@ -206,13 +206,13 @@
             self.environment.globals.pop(key, None)
 
     def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS):
-        if isinstance(source, basestring):
+        if isinstance(source, six.string_types):
             source = self.environment.parse(source)
         return extract_from_ast(source, gettext_functions)
 
     def parse(self, parser):
         """Parse a translatable tag."""
-        lineno = next(parser.stream).lineno
+        lineno = six.advance_iterator(parser.stream).lineno
         num_called_num = False
 
         # find all the variables referenced.  Additionally a variable can be
@@ -236,7 +236,7 @@
 
             # expressions
             if parser.stream.current.type == 'assign':
-                next(parser.stream)
+                six.advance_iterator(parser.stream)
                 variables[name.value] = var = parser.parse_expression()
             else:
                 variables[name.value] = var = nodes.Name(name.value, 'load')
@@ -262,7 +262,7 @@
         # if we have a pluralize block, we parse that too
         if parser.stream.current.test('name:pluralize'):
             have_plural = True
-            next(parser.stream)
+            six.advance_iterator(parser.stream)
             if parser.stream.current.type != 'block_end':
                 name = parser.stream.expect('name')
                 if name.value not in variables:
@@ -273,10 +273,10 @@
                 num_called_num = name.value == 'num'
             parser.stream.expect('block_end')
             plural_names, plural = self._parse_block(parser, False)
-            next(parser.stream)
+            six.advance_iterator(parser.stream)
             referenced.update(plural_names)
         else:
-            next(parser.stream)
+            six.advance_iterator(parser.stream)
 
         # register free names as simple name expressions
         for var in referenced:
@@ -301,15 +301,15 @@
         while 1:
             if parser.stream.current.type == 'data':
                 buf.append(parser.stream.current.value.replace('%', '%%'))
-                next(parser.stream)
+                six.advance_iterator(parser.stream)
             elif parser.stream.current.type == 'variable_begin':
-                next(parser.stream)
+                six.advance_iterator(parser.stream)
                 name = parser.stream.expect('name').value
                 referenced.append(name)
                 buf.append('%%(%s)s' % name)
                 parser.stream.expect('variable_end')
             elif parser.stream.current.type == 'block_begin':
-                next(parser.stream)
+                six.advance_iterator(parser.stream)
                 if parser.stream.current.test('name:endtrans'):
                     break
                 elif parser.stream.current.test('name:pluralize'):
@@ -382,7 +382,7 @@
     tags = set(['do'])
 
     def parse(self, parser):
-        node = nodes.ExprStmt(lineno=next(parser.stream).lineno)
+        node = nodes.ExprStmt(lineno=six.advance_iterator(parser.stream).lineno)
         node.node = parser.parse_tuple()
         return node
 
@@ -392,7 +392,7 @@
     tags = set(['break', 'continue'])
 
     def parse(self, parser):
-        token = next(parser.stream)
+        token = six.advance_iterator(parser.stream)
         if token.value == 'break':
             return nodes.Break(lineno=token.lineno)
         return nodes.Continue(lineno=token.lineno)
@@ -403,7 +403,7 @@
     tags = set(['with'])
 
     def parse(self, parser):
-        node = nodes.Scope(lineno=next(parser.stream).lineno)
+        node = nodes.Scope(lineno=six.advance_iterator(parser.stream).lineno)
         assignments = []
         while parser.stream.current.type != 'block_end':
             lineno = parser.stream.current.lineno
@@ -424,7 +424,7 @@
     tags = set(['autoescape'])
 
     def parse(self, parser):
-        node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno)
+        node = nodes.ScopedEvalContextModifier(lineno=six.advance_iterator(parser.stream).lineno)
         node.options = [
             nodes.Keyword('autoescape', parser.parse_expression())
         ]
@@ -477,7 +477,7 @@
         strings = []
         for arg in node.args:
             if isinstance(arg, nodes.Const) and \
-               isinstance(arg.value, basestring):
+               isinstance(arg.value, six.string_types):
                 strings.append(arg.value)
             else:
                 strings.append(None)