necrobump time. here’s my ready made script that supports different arities and a custom list of modules to combine into one.
defmodule MyApp.FullHouse do
use MyApp.FullHouse.Populate,
context_modules: [
MyApp.ModuleA,
MyApp.ModuleB,
MyApp.ModuleC,
MyApp.ModuleD
]
end
defmodule MyApp.FullHouse.Populate do
require Logger
defmacro __using__(opts) do
modules =
for {_, _, module_path} <- opts[:context_modules] do
("Elixir." <> Enum.join(module_path, "."))
|> String.to_atom()
end
for module <- modules, {fun, arity} <- apply(module, :__info__, [:functions]) do
quote do
defdelegate unquote(fun)(unquote_splicing(Macro.generate_arguments(arity, module))),
to: unquote(module)
end
end
|> tap(fn x -> Logger.info("Service Layer has #{length(x)} functions.") end)
end
end
Dunno if this is efficient or not, I’m just using this for prototyping to think my way to a better process. Pretty bad code smell if this ends up in production.