module RSpec::Core::SharedExampleGroup::Registry

def self.created_from_caller(other_caller)

def self.created_from_caller(other_caller)
  @caller_line == other_caller.last
end

def self.included(kls)

def self.included(kls)
  kls.describe(&@shared_block)
  kls.children.first.metadata[:shared_group_name] = name
end

def add_const(source, name, &block)

def add_const(source, name, &block)
  if Object.const_defined?(name)
    mod = Object.const_get(name)
    raise_name_error unless mod.created_from_caller(caller)
  end
  mod = Module.new do
    @shared_block = block
    @caller_line = caller.last
    def self.created_from_caller(other_caller)
      @caller_line == other_caller.last
    end
    def self.included(kls)
      kls.describe(&@shared_block)
      kls.children.first.metadata[:shared_group_name] = name
    end
  end
  shared_const = Object.const_set(name, mod)
  add_shared_example_group source, shared_const, block
end

def add_group(source, *args, &block)

def add_group(source, *args, &block)
  ensure_block_has_source_location(block, caller[1])
  if key? args.first
    key = args.shift
    warn_if_key_taken source, key, block
    add_shared_example_group source, key, block
  end
  unless args.empty?
    mod = Module.new
    (class << mod; self; end).send :define_method, :extended  do |host|
      host.class_eval(&block)
    end
    RSpec.configuration.extend mod, *args
  end
end

def add_shared_example_group(source, key, block)

def add_shared_example_group(source, key, block)
  shared_example_groups[source][key] = block
end

def clear

def clear
  @shared_example_groups.clear
end

def ensure_block_has_source_location(block, caller_line)

def ensure_block_has_source_location(block, caller_line)
  return if block.respond_to?(:source_location)
  block.extend Module.new {
    define_method :source_location do
      caller_line.split(':')
    end
  }
end

def example_block_for(source, key)

def example_block_for(source, key)
  shared_example_groups[source][key]
end

def formatted_location(block)

def formatted_location(block)
  block.source_location.join ":"
end

def key?(candidate)

def key?(candidate)
  [String, Symbol, Module].any? { |cls| cls === candidate }
end

def raise_name_error

def raise_name_error
  raise NameError, "The first argument (#{name}) to share_as must be a legal name for a constant not already in use."
end

def shared_example_groups

def shared_example_groups
  @shared_example_groups ||= Hash.new { |hash,key| hash[key] = Hash.new }
end

def shared_example_groups_for(*sources)

def shared_example_groups_for(*sources)
  Collection.new(sources, shared_example_groups)
end

def warn_if_key_taken(source, key, new_block)

def warn_if_key_taken(source, key, new_block)
  return unless existing_block = example_block_for(source, key)
  Kernel.warn <<-WARNING.gsub(/^ +\|/, '')
    |WARNING: Shared example group '#{key}' has been previously defined at:
    |  #{formatted_location existing_block}
    |...and you are now defining it at:
    |  #{formatted_location new_block}
    |The new definition will overwrite the original one.
  WARNING
end