module M
  ### Simple data structure for what a test method contains.
  #
  # Too lazy to make a class for this when it's really just a bag of data
  # without any behavior.
  #
  # Includes the name of this method, what line on the file it begins on,
  # and where it ends.
  class TestMethod < Struct.new(:name, :start_line, :end_line)
    # Set up a new test method for this test suite class
    def self.create(suite_class, test_method)
      # Hopefully it's been defined as an instance method, so we'll need to
      # look up the ruby Method instance for it
      method = suite_class.instance_method(test_method)

      # Ruby can find the starting line for us, so pull that out of the array
      start_line = method.source_location.last

      # Ruby can't find the end line however, and I'm too lazy to write
      # a parser. Instead, `method_source` adds `Method#source` so we can
      # deduce this ourselves.
      #
      # The end line should be the number of line breaks in the method source,
      # added to the starting line and subtracted by one.
      require "method_source"
      end_line = method.source.split("\n").size + start_line - 1

      # Shove the given attributes into a new databag
      new(test_method, start_line, end_line)
    end
  end
end

require "method_source"

module M
  ### Simple data structure for what a test method contains.
  #
  # Too lazy to make a class for this when it's really just a bag of data
  # without any behavior.
  #
  # Includes the name of this method, what line on the file it begins on,
  # and where it ends.
  class TestMethod < Struct.new(:name, :start_line, :end_line)
    # Set up a new test method for this test suite class
    def self.create(suite_class, test_method)
      # Hopefully it's been defined as an instance method, so we'll need to
      # look up the ruby Method instance for it
      method = suite_class.instance_method(test_method)

      # Ruby can find the starting line for us, so pull that out of the array
      start_line = method.source_location.last

      # Ruby can't find the end line however, and I'm too lazy to write
      # a parser. Instead, `method_source` adds `Method#source` so we can
      # deduce this ourselves.
      #
      # The end line should be the number of line breaks in the method source,
      # added to the starting line and subtracted by one.
      
      end_line = method.source.split("\n").size + start_line - 1

      # Shove the given attributes into a new databag
      new(test_method, start_line, end_line)
    end
  end
end

Move require outside of class method
Move require outside of class method

Otherwise if m is installed via gem install and run in a repo that doesn't have 
it inside of its Gemfile, the following error is thrown: 

cannot load such file -- method_source (LoadError)

All props on solving this in light of my derping around go to @schneems.