module RBS
  module UnitTest
    module Spy
      def self.wrap: [T] (untyped object, Symbol method_name) -> WrapSpy[T]
                   | [T, S] (untyped object, Symbol method_name) { (WrapSpy[T], T) -> S } -> S

      class WrapSpy[T]
        attr_accessor callback: ^(Test::CallTrace) -> void

        attr_reader object: T

        attr_reader method_name: Symbol

        def initialize: (object: T, method_name: Symbol) -> void

        def wrapped_object: () -> untyped
      end
    end
  end
end

class Proc
  def ruby2_keywords: () -> self
end

class Module
  def ruby2_keywords: (*Symbol) -> void
end
