module Pry::Byebug::Breakpoints

def add_file(file, line, expression = nil)


Adds a file breakpoint.
def add_file(file, line, expression = nil)
  real_file = (file != Pry.eval_path)
  fail(ArgumentError, 'Invalid file!') if real_file && !File.exist?(file)
  validate_expression expression
  path = (real_file ? File.expand_path(file) : file)
  bp = FileBreakpoint.new ::Byebug::Breakpoint.add(path, line, expression)
  breakpoints << bp
  bp
end

def add_method(method, expression = nil)


Adds a method breakpoint.
def add_method(method, expression = nil)
  validate_expression expression
  owner, name = method.split(/[\.#]/)
  byebug_bp = ::Byebug::Breakpoint.add(owner, name.to_sym, expression)
  bp = MethodBreakpoint.new byebug_bp, method
  breakpoints << bp
  bp
end

def breakpoints

def breakpoints
  @breakpoints ||= []
end

def change(id, expression = nil)


Changes the conditional expression for a breakpoint.
def change(id, expression = nil)
  validate_expression expression
  breakpoint = find_by_id(id)
  breakpoint.expr = expression
  breakpoint
end

def change_status(id, enabled = true)

def change_status(id, enabled = true)
  breakpoint = find_by_id(id)
  breakpoint.enabled = enabled
  breakpoint
end

def delete(id)


Deletes an existing breakpoint with the given ID.
def delete(id)
  deleted = ::Byebug.started? &&
    ::Byebug::Breakpoint.remove(id) && breakpoints.delete(find_by_id(id))
  fail(ArgumentError, "No breakpoint ##{id}") unless deleted
end

def delete_all


Deletes all breakpoints.
def delete_all
  @breakpoints = []
  ::Byebug.breakpoints.clear if ::Byebug.started?
end

def disable(id)


Disables a breakpoint with the given ID.
def disable(id)
  change_status id, false
end

def disable_all


Disables all breakpoints.
def disable_all
  each do |breakpoint|
    breakpoint.enabled = false
  end
end

def each(&block)

def each(&block)
  to_a.each(&block)
end

def enable(id)


Enables a disabled breakpoint with the given ID.
def enable(id)
  change_status id, true
end

def find_by_id(id)

def find_by_id(id)
  breakpoint = find { |b| b.id == id }
  fail(ArgumentError, "No breakpoint ##{id}!") unless breakpoint
  breakpoint
end

def size

def size
  to_a.size
end

def to_a

def to_a
  breakpoints
end

def validate_expression(exp)

def validate_expression(exp)
  return unless exp &&
               (exp.empty? || !Pry::Code.complete_expression?(exp))
  fail("Invalid breakpoint conditional: #{expression}")
end