Current section

Files

Jump to
injectx lib injectx.ex
Raw

lib/injectx.ex

defmodule Injectx do
@moduledoc "README.md"
|> File.read!()
|> String.split("<!-- MDOC !-->")
|> Enum.fetch!(1)
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
alias Injectx
import Injectx.Macro
import Injectx.Context,
only: [
inject_all: 1,
inject_all: 2,
dispatching: 4,
dispatching: 5
]
@imports []
@options opts
Module.register_attribute(__MODULE__, :inject, accumulate: true)
@on_definition Injectx
end
end
def __on_definition__(env, _kind, _name, _args, _guards, _body) do
resolve_injections(env.module)
end
defp resolve_injections(module) do
opts = Module.get_attribute(module, :options)
injection_points = Module.get_attribute(module, :inject)
Module.put_attribute(module, :imports, resolve_bindings(opts[:name], injection_points))
end
defp resolve_bindings(context_name, injection_points) do
Enum.map(injection_points, fn injection_point ->
Injectx.Context.inject(context_name, injection_point)
end)
end
end