module RR
  module DoubleDefinitions
    module Strategies
      module StrategyMethods
        extend(Module.new do
          def lately_bound_alias_method(target_method_name, source_method_name)
            module_eval(<<-METHOD, __FILE__, __LINE__+1)
              def #{target_method_name}(*args, &block)
                #{source_method_name}(*args, &block)
              end
            METHOD
          end
        end)

        def mock!(method_name=nil, &definition_eval_block)
          mock(Object.new, method_name, &definition_eval_block)
        end

        def stub!(method_name=nil, &definition_eval_block)
          stub(Object.new, method_name, &definition_eval_block)
        end

        def dont_allow!(method_name=nil, &definition_eval_block)
          dont_allow(Object.new, method_name, &definition_eval_block)
        end
        lately_bound_alias_method :do_not_allow, :dont_allow
        lately_bound_alias_method :do_not_allow!, :dont_allow!

        def proxy!(method_name=nil, &definition_eval_block)
          proxy(Object.new, method_name, &definition_eval_block)
        end
        lately_bound_alias_method :probe, :proxy
        lately_bound_alias_method :probe!, :proxy!

        def strong!(method_name=nil, &definition_eval_block)
          strong(Object.new, method_name, &definition_eval_block)
        end

        def any_instance_of!(method_name=nil, &definition_eval_block)
          any_instance_of(Object.new, method_name, &definition_eval_block)
        end

        def instance_of!(method_name=nil, &definition_eval_block)
          instance_of(Object.new, method_name, &definition_eval_block)
        end
        lately_bound_alias_method :all_instances_of, :instance_of
        lately_bound_alias_method :all_instances_of!, :instance_of!
      end
    end
  end
end
