         else
           @_create_tile(cx, cy, cz, cbounds, true)
 
-  _update: (abridged=false) =>
+  _fetch_tiles:(tiles) ->
+    for t in tiles
+      [x, y, z, bounds] = t
+      @_create_tile(x, y, z, bounds)
+
+  _update: () =>
     @mget('tile_source').update()
     extent = @get_extent()
     zoom_level = @mget('tile_source').get_level_by_extent(extent, @map_frame.get('height'), @map_frame.get('width'))

            parents.push(parent_key)
          need_load.push(t)

    # first draw stand-in parents =====================================
    @_render_tiles(parents)

    # load missing tiles ==============================================
    if not abridged
      for t in need_load
        [x, y, z, bounds] = t
        @_create_tile(x, y, z, bounds)

    # draw cached tiles ===============================================
    @_render_tiles(cached)
    for t in cached
      @mget('tile_source').tiles[t].current = true

    # prune cached tiles ===============================================
    #if not abridged
    #  @tile_source.prune_tiles()

class TileRenderer extends HasParent
  default_view: TileRendererView

    )
    @map_canvas.clip()

  _render_tiles: (tile_keys) ->
    @map_canvas.save()
    @_set_rect()
