defmodule Helper.Area do @moduledoc false defmacro __using__(_) do quote do import Helper.Area @moduledoc false end end defmacro field(name, value) do quote do defp unquote(name)(), do: unquote(value) end end defmacro builder do quote do def match?(number) do Regex.match?(regex(), number) end def builder(number) do [_ | country] = __MODULE__ |> Module.split |> Enum.reverse country = country |> Enum.reverse |> Module.concat [[_, code, area, number]] = Regex.scan(regex(), number) %{ country: country.country(), a2: country.a2(), a3: country.a3(), international_code: code, number: number, area_code: area, area_name: area_name(), area_type: area_type(), area_abbreviation: area_abbreviation() } end def build(number) do if match?(number) do {:ok, builder(number)} else {:error, "Not a valid phone number."} end end def build!(number) do if match?(number) do builder(number) else raise ArgumentError, message: "Not a valid phone number." end end end end end