class Pagy

def initialize(vars)

merge and validate the options, do some simple aritmetic and set the instance variables
def initialize(vars)
  @vars = VARS.merge(vars)                                              # default vars + instance vars
  @vars[:page] = (@vars[:page]||1).to_i                                 # set page to 1 if nil
  { count:0, items:1, outset:0, page:1 }.each do |k,min|                # validate core variables
    @vars[k] >= min rescue nil || raise(ArgumentError, "expected :#{k} >= #{min}; got #{@vars[k].inspect}")
    instance_variable_set(:"@#{k}", @vars.delete(k))                    # set instance variables
  end
  @pages  = @last = [(@count.to_f / @items).ceil, 1].max                # cardinal and ordinal meanings
  (1..@last).cover?(@page) || raise(OutOfRangeError, "expected :page in 1..#{@last}; got #{@page.inspect}")
  @offset = @items * (@page - 1) + @outset                              # pagination offset + outset (initial offset)
  @items  = @count % @items if @page == @last                           # adjust items for last page
  @from   = @count == 0 ? 0 : @offset+1 - @outset                       # page begins from item
  @to     = @offset + @items - @outset                                  # page ends to item
  @prev   = (@page-1 unless @page == 1)                                 # nil if no prev page
  @next   = (@page+1 unless @page == @last)                             # nil if no next page
end