'Construct an index object.
:param name:
The name of the index
:param \*expressions:
Column expressions to include in the index.   The expressions
are normally instances of :class:`.Column`, but may also
be arbitrary SQL expressions which ultmately refer to a
:class:`.Column`.
:param unique=False:
Keyword only argument; if True, create a unique index.
:param quote=None:
Keyword only argument; whether to apply quoting to the name of
the index.  Works in the same manner as that of
:paramref:`.Column.quote`.
:param \**kw: Additional keyword arguments not mentioned above are
dialect specific, and passed in the form ``<dialectname>_<argname>``.
See the documentation regarding an individual dialect at
:ref:`dialect_toplevel` for detail on documented arguments.'

def __init__(self, name, *expressions, **kw):

    self.table = None
    columns = []
    for expr in expressions:
        if (not isinstance(expr, ClauseElement)):
            columns.append(expr)
        else:
            cols = []
            visitors.traverse(expr, {}, {'column': cols.append})
            if cols:
                columns.append(cols[0])
            else:
                columns.append(expr)
    self.expressions = expressions
    self.name = quoted_name(name, kw.pop('quote', None))
    self.unique = kw.pop('unique', False)
    self._validate_dialect_kwargs(kw)
    ColumnCollectionMixin.__init__(self, *columns)
