lib/ex_machina_mongo/ex_machina_mongo.ex

defmodule ExMachinaMongo do
  defmacro __using__(opts) do
    verify_mongo_repo_dep()

    quote do
      use ExMachina
      use ExMachinaMongo.Strategy, repo: unquote(Keyword.get(opts, :repo))

      def params_for(factory_name, attrs \\ %{}) do
        ExMachinaMongo.params_for(__MODULE__, factory_name, attrs)
      end

      def string_params_for(factory_name, attrs \\ %{}) do
        ExMachinaMongo.string_params_for(__MODULE__, factory_name, attrs)
      end
    end
  end

  defp verify_mongo_repo_dep() do
    unless Code.ensure_loaded?(Mongo.Repo) do
      raise "You tried to use ExMachinaMongo, but the Mongo.Repo module is not loaded. " <>
              "Please add ecto to your dependencies."
    end
  end

  def params_for(factory_module, factory_name, attrs \\ %{}) do
    %{__struct__: module} = document = factory_module.build(factory_name, attrs)
    module.dump(document)
  end

  def string_params_for(factory_module, factory_name, attrs \\ %{}) do
    %{__struct__: module} = document = factory_module.build(factory_name, attrs)

    module.dump(document)
  end
end