class ActionDispatch::Request::Session

:nodoc:
Session is responsible for lazily loading the session from store.

def self.create(store, env, default_options)

def self.create(store, env, default_options)
  session_was = find env
  session     = Request::Session.new(store, env)
  session.merge! session_was if session_was
  set(env, session)
  Options.set(env, Request::Session::Options.new(store, env, default_options))
  session
end

def self.find(env)

def self.find(env)
  env[ENV_SESSION_KEY]
end

def self.set(env, session)

def self.set(env, session)
  env[ENV_SESSION_KEY] = session
end

def [](key)

def [](key)
  load_for_read!
  @delegate[key.to_s]
end

def []=(key, value)

def []=(key, value)
  load_for_write!
  @delegate[key.to_s] = value
end

def clear

def clear
  load_for_write!
  @delegate.clear
end

def delete(key)

def delete(key)
  load_for_write!
  @delegate.delete key.to_s
end

def destroy

def destroy
  clear
  options = self.options || {}
  new_sid = @by.send(:destroy_session, @env, options[:id], options)
  options[:id] = new_sid # Reset session id with a new value or nil
  # Load the new sid to be written with the response
  @loaded = false
  load_for_write!
end

def empty?

def empty?
  load_for_read!
  @delegate.empty?
end

def exists?

def exists?
  return @exists unless @exists.nil?
  @exists = @by.send(:session_exists?, @env)
end

def fetch(key, default=Unspecified, &block)

def fetch(key, default=Unspecified, &block)
  load_for_read!
  if default == Unspecified
    @delegate.fetch(key.to_s, &block)
  else
    @delegate.fetch(key.to_s, default, &block)
  end
end

def has_key?(key)

def has_key?(key)
  load_for_read!
  @delegate.key?(key.to_s)
end

def id

def id
  options[:id]
end

def initialize(by, env)

def initialize(by, env)
  @by       = by
  @env      = env
  @delegate = {}
  @loaded   = false
  @exists   = nil # we haven't checked yet
end

def inspect

def inspect
  if loaded?
    super
  else
    "#<#{self.class}:0x#{(object_id << 1).to_s(16)} not yet loaded>"
  end
end

def keys

def keys
  @delegate.keys
end

def load!

def load!
  id, session = @by.load_session @env
  options[:id] = id
  @delegate.replace(stringify_keys(session))
  @loaded = true
end

def load_for_read!

def load_for_read!
  load! if !loaded? && exists?
end

def load_for_write!

def load_for_write!
  load! unless loaded?
end

def loaded?

def loaded?
  @loaded
end

def merge!(other)

def merge!(other)
  load_for_write!
  @delegate.merge!(other)
end

def options

def options
  Options.find @env
end

def stringify_keys(other)

def stringify_keys(other)
  other.each_with_object({}) { |(key, value), hash|
    hash[key.to_s] = value
  }
end

def to_hash

def to_hash
  load_for_read!
  @delegate.dup.delete_if { |_,v| v.nil? }
end

def update(hash)

def update(hash)
  load_for_write!
  @delegate.update stringify_keys(hash)
end

def values

def values
  @delegate.values
end