Skip to content

Instantly share code, notes, and snippets.

@egze
Forked from 0x6a6/foo.ex
Created June 12, 2020 16:16
Show Gist options
  • Save egze/73dca3cd54cca91d2de296eac576db64 to your computer and use it in GitHub Desktop.
Save egze/73dca3cd54cca91d2de296eac576db64 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