def make_multi_metatile(parent, tiles, date_time=None):
    """
    Make a metatile containing a list of tiles all having the same layer,
    with coordinates relative to the given parent. Set date_time to a 6-tuple
    of (year, month, day, hour, minute, second) to set the timestamp for
    members. Otherwise the current wall clock time is used.
    """

    assert parent is not None, \
        "Parent tile must be provided and not None to make a metatile."

    if len(tiles) == 0:
        return []

    if date_time is None:
        date_time = gmtime()[0:6]

    layer = tiles[0]['layer']

    buf = StringIO.StringIO()
    with zipfile.ZipFile(buf, mode='w') as z:
        for tile in tiles:
            assert tile['layer'] == layer

            coord = tile['coord']

            # change in zoom level from parent to coord. since parent should
            # be a parent, its zoom should always be equal or smaller to that
            # of coord.
            delta_z = coord.zoom - parent.zoom
            assert delta_z >= 0, "Coordinates must be descendents of parent"

            # change in row/col coordinates are relative to the upper left
            # coordinate at that zoom. both should be positive.
            delta_row = coord.row - (int(parent.row) << delta_z)
            delta_column = coord.column - (int(parent.column) << delta_z)
            assert delta_row >= 0, \
                "Coordinates must be contained by their parent, but " + \
                "row is not."
            assert delta_column >= 0, \
                "Coordinates must be contained by their parent, but " + \
                "column is not."

            tile_name = '%d/%d/%d.%s' % \
                (delta_z, delta_column, delta_row, tile['format'].extension)
            tile_data = tile['tile']
            info = zipfile.ZipInfo(tile_name, date_time)
            z.writestr(info, tile_data, zipfile.ZIP_DEFLATED)

    return [dict(tile=buf.getvalue(), format=zip_format, coord=parent,
                 layer=layer)]