module Bundler

def bundle_path

def bundle_path
  @bundle_path ||= begin
    path = settings[:path] || "#{Gem.user_home}/.bundle"
    Pathname.new(path).expand_path(root)
  end
end

def cache

def cache
  home.join("cache")
end

def configure

def configure
  @configured ||= begin
    configure_gem_home_and_path
    true
  end
end

def configure_gem_home_and_path

def configure_gem_home_and_path
  if path = settings[:path]
    ENV['GEM_HOME'] = File.expand_path(path, root)
    ENV['GEM_PATH'] = ''
  else
    gem_home, gem_path = Gem.dir, Gem.path
    ENV["GEM_PATH"] = [gem_home, gem_path].flatten.compact.join(File::PATH_SEPARATOR)
    ENV["GEM_HOME"] = bundle_path.to_s
  end
  Gem.clear_paths
end

def default_gemfile

def default_gemfile
  current = Pathname.new(Dir.pwd)
  until current.root?
    filename = current.join("Gemfile")
    return filename if filename.exist?
    current = current.parent
  end
  raise GemfileNotFound, "The default Gemfile was not found"
end

def definition(gemfile = default_gemfile)

def definition(gemfile = default_gemfile)
  configure
  root = Pathname.new(gemfile).dirname
  lockfile = root.join("Gemfile.lock")
  if lockfile.exist?
    Definition.from_lock(lockfile)
  else
    Definition.from_gemfile(gemfile)
  end
end

def home

def home
  Pathname.new(bundle_path).join("bundler")
end

def install_path

def install_path
  home.join("gems")
end

def load(gemfile = default_gemfile)

def load(gemfile = default_gemfile)
  root = Pathname.new(gemfile).dirname
  Runtime.new root, definition(gemfile)
end

def require(*groups)

def require(*groups)
  gemfile = default_gemfile
  load(gemfile).require(*groups)
end

def root

def root
  default_gemfile.dirname
end

def settings

def settings
  @settings ||= Settings.new(root)
end

def setup(*groups)

def setup(*groups)
  gemfile = default_gemfile
  load(gemfile).setup(*groups)
end

def ui

def ui
  @ui ||= UI.new
end