'Represent multiple values as a comma-separated list.
@param values: list of values
@param rows: the referenced rows (if values are foreign keys)
@param show_link: render each representation as link'

def multiple(self, values, rows=None, list_type=True, show_link=True):

    self._setup()
    show_link = (show_link and self.show_link)
    if (rows and self.table):
        key = self.key
        values = [row[key] for row in rows]
    elif (self.list_type and list_type):
        try:
            hasnone = (None in values)
            if hasnone:
                values = [i for i in values if (i != None)]
            values = list(set(chain.from_iterable(values)))
            if hasnone:
                values.append(None)
        except TypeError:
            raise ValueError(('List    of    lists    expected,    got    %s' % values))
    else:
        values = ([values] if (type(values) is not list) else values)
    if values:
        default = self.default
        items = self._lookup(values, rows=rows)
        if show_link:
            link = self.link
            rows = self.rows
            labels = [([link(k, s3_str(items[k]), row=rows.get(k)), ',    '] if (k in items) else [default, ',    ']) for k in values]
            if labels:
                return TAG[''](list(chain.from_iterable(labels))[:(-1)])
            else:
                return ''
        else:
            labels = [(s3_str(items[k]) if (k in items) else default) for k in values]
            if labels:
                return ',    '.join(labels)
    return self.none
