Sha256: 8fb230b8735b7e4e7b3ab79fe1088290267d437381970e47c6cf533c6744ddc5

Contents?: true

Size: 1.49 KB

Versions: 2

Compression:

Stored size: 1.49 KB

Contents

# Represents a completion mission specified by :object in Bond.complete. Unlike other missions, this
# one needs to both match the mission condition and have the current object being completed have
# an ancestor specified by :object.
class Bond::Missions::ObjectMission < Bond::Mission
  #:stopdoc:
  attr_reader :object_condition

  def initialize(options={})
    @object_condition = options.delete(:object)
    @object_condition = /^#{Regexp.quote(@object_condition.to_s)}$/ unless @object_condition.is_a?(Regexp)
    options[:on] = /^((\.?[^.]+)+)\.([^.]*)$/
    @eval_binding = options[:eval_binding]
    super
  end

  def handle_valid_match(input)
    match = super
    if match && eval_object(match) && (match = @evaled_object.class.ancestors.any? {|e| e.to_s =~ @object_condition })
      @list_prefix = @matched[1] + "."
      @input = @matched[3]
      @input.instance_variable_set("@object", @evaled_object)
      @input.instance_eval("def self.object; @object ; end")
      @action ||= lambda {|e| default_action(e.object) }
    else
      match = false
    end
    match
  end

  def eval_object(match)
    @matched = match
    @evaled_object = begin eval("#{match[1]}", eval_binding); rescue Exception; nil end
  end

  def default_action(obj)
    obj.methods.map {|e| e.to_s} - OPERATORS
  end

  def eval_binding
    @eval_binding ||= default_eval_binding
  end

  def default_eval_binding
    Object.const_defined?(:IRB) ? IRB.CurrentContext.workspace.binding : ::TOPLEVEL_BINDING
  end
  #:startdoc:
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
cldwalker-bond-0.1.1 lib/bond/missions/object_mission.rb
bond-0.1.1 lib/bond/missions/object_mission.rb