module RSpec::Core::Metadata::MetadataHash

def [](key)

def [](key)
  return super if has_key?(key)
  case key
  when :location
    store(:location, location)
  when :file_path, :line_number
    file_path, line_number = file_and_line_number
    store(:file_path, file_path)
    store(:line_number, line_number)
    super
  when :execution_result
    store(:execution_result, {})
  when :describes
    store(:describes, described_class_for(self))
  when :full_description
    store(:full_description, full_description_for(self))
  when :description
    store(:description, build_description_from(*self[:description_args]))
  else
    super
  end
end

def build_description_from(*parts)

def build_description_from(*parts)
  parts.map {|p| p.to_s}.reduce do |desc, p|
    p =~ /^(#|::|\.)/ ? "#{desc}#{p}" : "#{desc} #{p}"
  end || ""
end

def described_class_for(m)

def described_class_for(m)
  m[:example_group][:describes]
end

def file_and_line_number

def file_and_line_number
  first_caller_from_outside_rspec =~ /(.+?):(\d+)(|:\d+)/
  return [$1, $2.to_i]
end

def first_caller_from_outside_rspec

def first_caller_from_outside_rspec
  self[:caller].detect {|l| l !~ /\/lib\/rspec\/core/}
end

def full_description_for(m)

def full_description_for(m)
  build_description_from(m[:example_group][:full_description], *m[:description_args])
end

def location

def location
  "#{self[:file_path]}:#{self[:line_number]}"
end