Skip to content

Instantly share code, notes, and snippets.

@0x6a68
Last active May 26, 2021
Embed
What would you like to do?
Spec to Callback
defmodule MyApp.Foo do
@on_definition MyApp.SpecToCallback
@spec bar(String.t()) :: String.t()
def bar(foobar) do
impl().bar(foobar)
end
defp impl, do: Application.get_env(:my_app, :my_app_foo_impl, __MODULE__.DefaultImpl)
end
defmodule MyApp.Foo.DefaultImpl do
@behaviour MyApp.Foo
@impl true
@spec bar(String.t()) :: String.t()
def bar(foobar) do
foobar
end
end
defmodule MyApp.SpecToCallback do
def __on_definition__(env, :def, name, args, _guards, _body) do
Module.spec_to_callback(env.module, {name, length(args)})
end
def __on_definition__(_, _, _, _, _, _), do: nil
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment