class Rspec::Core::Metadata

def self.process(superclass_metadata, *args)

def self.process(superclass_metadata, *args)
  new(superclass_metadata) do |metadata|
    metadata.process(*args)
  end
end

def configure_for_example(desc, options)

def configure_for_example(desc, options)
  store(:description, desc.to_s)
  store(:execution_result, {})
  store(:caller, options.delete(:caller))
  if self[:caller]
    store(:file_path, determine_file_path)
    store(:line_number, determine_line_number)
  end
  update(options)
end

def determine_file_path(given_file_path=nil)

def determine_file_path(given_file_path=nil)
  return given_file_path if given_file_path
  possible_files.first.split(':').first.strip
end

def determine_line_number(given_line_number=nil)

def determine_line_number(given_line_number=nil)
  return given_line_number if given_line_number
  possible_files.first.split(':')[1].to_i
end

def determine_name

def determine_name
  if superclass_metadata && superclass_metadata[:behaviour][:name]
    self[:behaviour][:name] = "#{superclass_metadata[:behaviour][:name]} #{self[:behaviour][:description]}".strip 
  else
    self[:behaviour][:name] = "#{self[:behaviour][:describes]} #{self[:behaviour][:description]}".strip
  end
end

def for_example(desc, options)

def for_example(desc, options)
  dup.configure_for_example(desc,options)
end

def initialize(superclass_metadata=nil)

def initialize(superclass_metadata=nil)
  @superclass_metadata = superclass_metadata
  update(@superclass_metadata) if @superclass_metadata
  store(:behaviour, {})
  yield self if block_given?
end

def possible_files

def possible_files
  self[:behaviour][:caller].grep(/\_spec\.rb:/i)
end

def process(*args)

def process(*args)
  extra_metadata = args.last.is_a?(Hash) ? args.pop : {}
  extra_metadata.delete(:behaviour) # Remove it when present to prevent it clobbering the one we setup
  self[:behaviour][:describes] = args.shift unless args.first.is_a?(String)
  self[:behaviour][:describes] ||= self.superclass_metadata && self.superclass_metadata[:behaviour][:describes]
  self[:behaviour][:description] = args.shift || ''
  self[:behaviour][:name] = determine_name
  self[:behaviour][:block] = extra_metadata.delete(:behaviour_block)
  self[:behaviour][:caller] = extra_metadata.delete(:caller)
  self[:behaviour][:file_path] = determine_file_path(extra_metadata.delete(:file_path))
  self[:behaviour][:line_number] = determine_line_number(extra_metadata.delete(:line_number))
  update(extra_metadata)
end