class FactoryBot::StrategySyntaxMethodRegistrar

@api private

def self.with_index(block, index)

def self.with_index(block, index)
  if block&.arity == 2
    ->(instance) { block.call(instance, index) }
  else
    block
  end
end

def define_list_strategy_method

def define_list_strategy_method
  strategy_name = @strategy_name
  define_syntax_method("#{strategy_name}_list") do |name, amount, *traits_and_overrides, &block|
    unless amount.respond_to?(:times)
      raise ArgumentError, "count missing for #{strategy_name}_list"
    end
    Array.new(amount) do |i|
      block_with_index = StrategySyntaxMethodRegistrar.with_index(block, i)
      send(strategy_name, name, *traits_and_overrides, &block_with_index)
    end
  end
end

def define_pair_strategy_method

def define_pair_strategy_method
  strategy_name = @strategy_name
  define_syntax_method("#{strategy_name}_pair") do |name, *traits_and_overrides, &block|
    Array.new(2) { send(strategy_name, name, *traits_and_overrides, &block) }
  end
end

def define_singular_strategy_method

def define_singular_strategy_method
  strategy_name = @strategy_name
  define_syntax_method(strategy_name) do |name, *traits_and_overrides, &block|
    FactoryRunner.new(name, strategy_name, traits_and_overrides).run(&block)
  end
end

def define_strategy_methods

def define_strategy_methods
  define_singular_strategy_method
  define_list_strategy_method
  define_pair_strategy_method
end

def define_syntax_method(name, &block)

def define_syntax_method(name, &block)
  FactoryBot::Syntax::Methods.module_exec do
    if method_defined?(name) || private_method_defined?(name)
      undef_method(name)
    end
    define_method(name, &block)
  end
end

def initialize(strategy_name)

def initialize(strategy_name)
  @strategy_name = strategy_name
end