Skip to content

Instantly share code, notes, and snippets.

@christhekeele
Forked from 0x6a68/foo.ex
Created June 12, 2020 07:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christhekeele/608ba52ad6d3e1a9400e33dd98c6a858 to your computer and use it in GitHub Desktop.
Save christhekeele/608ba52ad6d3e1a9400e33dd98c6a858 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