module Isolator

def adapters

def adapters
  @adapters ||= Isolator::SimpleHashie.new
end

def clear_transactions!

def clear_transactions!
  Thread.current[:isolator_transactions] = 0
end

def config

def config
  @config ||= Configuration.new
end

def configure

def configure
  yield config
end

def decr_transactions!

def decr_transactions!
  Thread.current[:isolator_transactions] =
    Thread.current.fetch(:isolator_transactions) - 1
  finish! if Thread.current.fetch(:isolator_transactions) == (transactions_threshold - 1)
end

def disable

Accepts block and disable Isolator within
def disable
  return yield if disabled?
  res = nil
  begin
    disable!
    res = yield
  ensure
    enable!
  end
  res
end

def disable!

def disable!
  Thread.current[:isolator_disabled] = true
end

def disabled?

def disabled?
  Thread.current[:isolator_disabled] == true
end

def enable

Accepts block and enable Isolator within
def enable
  return yield if enabled?
  res = nil
  begin
    enable!
    res = yield
  ensure
    disable!
  end
  res
end

def enable!

def enable!
  Thread.current[:isolator_disabled] = false
end

def enabled?

def enabled?
  !disabled?
end

def incr_transactions!

def incr_transactions!
  Thread.current[:isolator_transactions] =
    Thread.current.fetch(:isolator_transactions, 0) + 1
  start! if Thread.current.fetch(:isolator_transactions) == transactions_threshold
end

def notify(exception:, backtrace:)

def notify(exception:, backtrace:)
  Notifier.new(exception, backtrace).call
end

def transactions_threshold

def transactions_threshold
  Thread.current.fetch(:isolator_threshold, 1)
end

def transactions_threshold=(val)

def transactions_threshold=(val)
  Thread.current[:isolator_threshold] = val
end

def within_transaction?

def within_transaction?
  Thread.current.fetch(:isolator_transactions, 0) >= transactions_threshold
end