class Spec::Example::SharedExampleGroup

def add_shared_example_group(new_example_group)

def add_shared_example_group(new_example_group)
  guard_against_redefining_existing_example_group(new_example_group)
  shared_example_groups << new_example_group
end

def execute_in_class_hierarchy(superclass_last=false)

def execute_in_class_hierarchy(superclass_last=false)
  classes = [self]
  superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
  classes.each do |example_group|
    yield example_group
  end
end

def find_shared_example_group(example_group_description)

def find_shared_example_group(example_group_description)
  shared_example_groups.find do |b|
    b.description == example_group_description
  end
end

def guard_against_redefining_existing_example_group(new_example_group)

def guard_against_redefining_existing_example_group(new_example_group)
  existing_example_group = find_shared_example_group(new_example_group.description)
  return unless existing_example_group
  return if new_example_group.equal?(existing_example_group)
  return if spec_path(new_example_group) == spec_path(existing_example_group)
  raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
end

def included(mod) # :nodoc:

:nodoc:
def included(mod) # :nodoc:
  mod.module_eval(&@example_group_block)
end

def initialize(*args, &example_group_block)

def initialize(*args, &example_group_block)
  describe(*args)
  @example_group_block = example_group_block
  self.class.add_shared_example_group(self)
end

def shared_example_groups

def shared_example_groups
  # TODO - this needs to be global, or at least accessible from
  # from subclasses of Example in a centralized place. I'm not loving
  # this as a solution, but it works for now.
  $shared_example_groups ||= []
end

def spec_path(example_group)

def spec_path(example_group)
  File.expand_path(example_group.spec_path)
end