Current section

Files

Jump to
oops lib oops.ex
Raw

lib/oops.ex

defmodule Oops do
defmacro __using__(like: module) do
{module, _} = Code.eval_quoted(module)
[constructor|[value_func|methods(module)]]
end
defp constructor do
quote do
def new(str), do: {__MODULE__, str}
end
end
defp value_func do
quote do
def value({__MODULE__, str}), do: str
end
end
defp methods(module) do
for {name, arity} <- module.__info__(:functions) do
vars = generate_vars(arity-1)
quote do
def unquote(name)(unquote_splicing(vars), {__MODULE__, value}) do
{__MODULE__, unquote(module).unquote(name)(value, unquote_splicing(vars))}
end
end
end
end
defp generate_vars(0), do: []
defp generate_vars(count) do
for index <- 1..count, do: Macro.var(:"var#{index}", __MODULE__)
end
end