Last active
April 13, 2016 07:57
-
-
Save pikender/892fd3707043bacecc73ad24ba45cdba to your computer and use it in GitHub Desktop.
Model Support Function Extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Nectar.ModelExtension do | |
defmacro __using__(_opts) do | |
quote do | |
Module.register_attribute(__MODULE__, :method_block, accumulate: true) | |
import Nectar.ModelExtension, only: [include_method: 1] | |
@before_compile Nectar.ModelExtension | |
end | |
end | |
defmacro include_method([do: block]) do | |
support_fn = Macro.escape(block) | |
quote bind_quoted: [support_fn: support_fn] do | |
Module.put_attribute(__MODULE__, :method_block, support_fn) | |
end | |
end | |
defmacro __before_compile__(_env) do | |
quote do | |
defmacro include_methods do | |
@method_block | |
end | |
## before_compile hook as needed in ExtendProduct for Product | |
defmacro __before_compile__(_env) do | |
quote do | |
include_methods | |
end | |
end | |
end | |
end | |
end | |
defmodule Nectar.ExtendProduct do | |
use Nectar.ModelExtension | |
defmacro __using__(_opts) do | |
quote do | |
import Nectar.ExtendProduct, only: [include_methods: 0] | |
@before_compile Nectar.ExtendProduct | |
end | |
end | |
include_method do: (def fn_from_outside, do: "support function") | |
end | |
defmodule Nectar.Product do | |
... | |
# Add new support function here | |
use Nectar.ExtendProduct | |
... | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment