lib/fermo.ex

defmodule Fermo do
  @moduledoc """
  Fermo provides the main entry points for configuring a project
  """

  @build Application.get_env(:fermo, :build, Fermo.Build)
  @pagination Application.get_env(:fermo, :pagination, Fermo.Pagination)

  def start(_start_type, _args \\ []) do
    {:ok, _pid} = Fermo.Assets.start_link()
    {:ok, _pid} = I18n.start_link()
    {:ok, self()}
  end

  @doc false
  defmacro __using__(opts \\ %{}) do
    quote do
      require Fermo

      @before_compile Fermo
      Module.register_attribute __MODULE__, :config, persist: true
      @config unquote(opts)

      import Fermo.Assets
      import I18n
    end
  end

  @doc false
  defmacro __before_compile__(_env) do
    quote do
      def initial_config() do
        hd(__MODULE__.__info__(:attributes)[:config])
        |> Fermo.Config.initial()
      end
    end
  end

  def page(config, template, filename, params \\ nil) do
    Fermo.Config.add_page(config, template, filename, params)
  end

  def paginate(config, template, options \\ %{}, context \\ %{}, fun \\ nil) do
    @pagination.paginate(config, template, options, context, fun)
  end

  def build(config) do
    @build.run(config)
  end
end