Luca.concerns.Paginatable = 
  paginatorViewClass: 'Luca.components.PaginationControl'
  paginationSelector: ".toolbar.bottom.pagination-container"

  __included: ()->
    _.extend(Luca.Collection::, __paginators: {})

  __initializer:()->
    if @paginatable is false
      return

    if _.isNumber(@paginatable) or _.isString(@paginatable)
      @paginatable = limit: parseInt(@paginatable), page: 1

    unless Luca.isBackboneCollection(@collection)
      @debug "Skipping Paginatable due to no collection being present on #{ @name || @cid }"
      @debug "collection", @collection
      return

    _.bindAll @, "paginationControl", "pager"

    collection = (@getCollection ||= ()-> @collection)()

    paginationState = @getPaginationState()

    @optionsSources ||= []
    @queryOptions ||= {}

    @optionsSources.push ()=> 
      options = _( paginationState.toJSON() ).pick('limit','page','sortBy')
      _.extend(options, pager: @pager)

    paginationState.on "change:page", ()=> @trigger "pagination:change"

    @on "pagination:change",  Luca.concerns.Filterable.classMethods.prepare, @
    @on "before:render", @renderPaginationControl, @

  pager: (numberOfPages, models)->
    @getPaginationState().set(numberOfPages: numberOfPages, itemCount: models.length)
    @paginationControl().updateWithPageCount( numberOfPages, models )

  isRemote: ()->
    @getQueryOptions().remote is true    

  getPaginationState: ()->
    @collection.__paginators[ @cid ] ||= @paginationControl().state

  paginationContainer: ()->
    @$(">#{ @paginationSelector }")

  setCurrentPage: (page=1, options={})->
    @getPaginationState().set('page', page, options)

  setPage: (page=1, options={})->
    @getPaginationState().set('page', page, options)

  setLimit: (limit=0,options={})->
    @getPaginationState().set('limit', limit, options)

  paginationControl: ()->
    return @paginator if @paginator?

    _.defaults(@paginatable ||= {}, page: 1, limit: 20)

    @paginator = Luca.util.lazyComponent
      type: "pagination_control" 
      collection: @getCollection()
      defaultState: @paginatable 
      parent: (@name || @cid)
      debugMode: @debugMode

    @paginator

  renderPaginationControl: ()->
    control = @paginationControl()
    @paginationContainer().append( control.render().$el )
    control