Sha256: 1bc60fffb107c097a6d65e5fa85fcdf68f3bb77cfff8e069c559f358dd2466a8

Contents?: true

Size: 1.49 KB

Versions: 4

Compression:

Stored size: 1.49 KB

Contents

# A mission which completes an object's methods. For this mission to match, the
# condition must match and the current object must have an ancestor that matches
# :object.  Note: To access to the current object being completed on within an
# action, use the input's object attribute.
#
# ==== Bond.complete Options:
# [:action] If an action is not specified, the default action is to complete an
#           object's non-operator methods.
#
# ===== Example:
#   Bond.complete(:object => 'ActiveRecord::Base') {|input| input.object.class.instance_methods(false) }
class Bond::ObjectMission < Bond::Mission
  OBJECTS = %w<\S+> + Bond::Mission::OBJECTS
  CONDITION = '(OBJECTS)\.(\w*(?:\?|!)?)$'
  def initialize(options={}) #@private
    @object_condition = /^#{options[:object]}$/
    options[:on] ||= Regexp.new condition_with_objects
    super
  end

  def match_message #@private
    "Matches completion for object with ancestor matching #{@object_condition.inspect}."
  end

  protected
  def unique_id
    "#{@object_condition.inspect}+#{@on.inspect}"
  end

  def do_match(input)
    super && eval_object(@matched[1]) && @evaled_object.class.respond_to?(:ancestors) &&
      @evaled_object.class.ancestors.any? {|e| e.to_s =~ @object_condition }
  end

  def after_match(input)
    @completion_prefix = @matched[1] + "."
    @action ||= lambda {|e| default_action(e.object) }
    create_input @matched[2], :object => @evaled_object
  end

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

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
bond-0.4.2 lib/bond/missions/object_mission.rb
bond-0.4.2-java lib/bond/missions/object_mission.rb
bond-0.4.1 lib/bond/missions/object_mission.rb
bond-0.4.0 lib/bond/missions/object_mission.rb