Skip to content

Instantly share code, notes, and snippets.

@0x6a68
Last active May 26, 2021 15:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save 0x6a68/6f7acbaaa3cd2f9cdbf2afe8c13328f0 to your computer and use it in GitHub Desktop.
Save 0x6a68/6f7acbaaa3cd2f9cdbf2afe8c13328f0 to your computer and use it in GitHub Desktop.
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