module Cucumber::Ast::HasSteps

def accept_hook?(hook)

def accept_hook?(hook)
  Gherkin::TagExpression.new(hook.tag_expressions).evaluate(source_tags)
end

def attach_steps(steps)

def attach_steps(steps)
  steps.each do |step| 
    step.feature_element = self
  end
end

def backtrace_line(step_name = "#{@keyword}: #{name}", line = self.line)

def backtrace_line(step_name = "#{@keyword}: #{name}", line = self.line)
  "#{location.on_line(line)}:in `#{step_name}'"
end

def first_line_length

def first_line_length
  name_line_lengths[0]
end

def gherkin_statement(statement=nil)

def gherkin_statement(statement=nil)
  @gherkin_statement ||= statement
end

def language

def language
  @language || raise("Language is required for a #{self.class}")
end

def matches_scenario_names?(scenario_name_regexps)

def matches_scenario_names?(scenario_name_regexps)
  scenario_name_regexps.detect{|n| n =~ name}
end

def max_line_length

def max_line_length
  steps.max_line_length(self)
end

def name_line_lengths

def name_line_lengths
  if name.strip.empty?
    [Ast::Step::INDENT + @keyword.unpack('U*').length + ': '.length]
  else
    name.split("\n").enum_for(:each_with_index).map do |line, line_number|
      if line_number == 0
        Ast::Step::INDENT + @keyword.unpack('U*').length + ': '.length + line.unpack('U*').length
      else
        Ast::Step::INDENT + Ast::Step::INDENT + line.unpack('U*').length
      end
    end
  end
end

def source_indent(text_length)

def source_indent(text_length)
  max_line_length - text_length
end

def source_tag_names

def source_tag_names
  source_tags.map { |tag| tag.name }
end

def source_tags

def source_tags
  @tags.tags.to_a + feature_tags.tags.to_a
end

def text_length

def text_length
  name_line_lengths.max
end