Accumulating Attributes In Elixir
Typically, if you declare an attribute twice like this:
@unit_of_measure :fathom
@unit_of_measure :stone
The second declaration will override the first:
IO.inspect(@unit_of_measure)
# :stone
But by registering the attribute by calling register_attribute
you get the
opportunity to set the attribute to accumulate. When accumulating, each declaration will push the declared value onto the head of a list.
defmodule TriColarian do
@moduledoc false
Module.register_attribute(__MODULE__, :colors, accumulate: true)
@colors :green
@colors :red
@colors :yellow
def colors do
@colors
end
end
TriColarian.colors()
# [:yellow, :red, :green]
At compile time, perhaps when executing a macro, you have the opportunity to dynamically build a list.
I learned this when Andrew Summers gave a talk on DSLs at Chicago Elixir this past Wednesday. You can see his slides here
Tweet