defmodule BinanceHttp.Api.BehaviourDef do defmacro __using__(_opts \\ []) do quote do @after_compile {BinanceHttp.Api, :__after_compile__} Module.register_attribute __MODULE__, :methods, accumulate: true def __methods__, do: Module.get_attribute(__MODULE__, :methods) end end def define(module, name) do Module.put_attribute(module, :methods, name) end def define_module(env) do module = Module.concat(env.module, Behaviour) methods = env.module.__methods__ contents = Enum.map(methods, &define_callbacks/1) Module.create(module, contents, env) end defp define_callbacks(method) do quote do @callback unquote(method)() :: :ok | {:ok, term} | {:error, term} @callback unquote(method)(params :: map | Keyword.t) :: :ok | {:ok, term} | {:error, term} @callback unquote(method)(params :: map | Keyword.t, opts :: Keyword.t) :: :ok | {:ok, term} | {:error, term} end end end