Current section
Files
Jump to
Current section
Files
lib/plus_one_updoot.ex
defmodule PlusOneUpdoot do
alias PlusOneUpdoot.Counter
alias PlusOneUpdoot.RuntimeError, as: PlusOneUpdootRuntimeError
def module!(fake_module \\ FakeModule) when is_atom(fake_module) do
try do
[_ | _] = fake_module.module_info()
raise PlusOneUpdootRuntimeError,
"#{inspect(fake_module)} is a REAL module. Use a FAKE module."
rescue
exception ->
case exception do
%UndefinedFunctionError{
arity: 0,
function: :module_info,
message: nil,
module: ^fake_module,
reason: nil
} ->
case Counter.increment_module!(fake_module) do
{:ok, unique_fake_module} ->
unique_fake_module
{:error, error_message} ->
raise PlusOneUpdootRuntimeError, error_message
end
%PlusOneUpdootRuntimeError{} ->
reraise exception, __STACKTRACE__
end
end
end
end