Writing Extensions
Table of Contents
Writing extensions generally involves three main components.
The DSL declaration
The DSL is declared as a series of
Spark.Dsl.Section
, which can contain
Spark.Dsl.Entity
and further
Spark.Dsl.Section
structs. See
Spark.Dsl.Section
and
Spark.Dsl.Entity
for more information.
Transformers
Extension writing gets a bit more complicated when you get into the world of transformers, but this is also where a lot of the power is. Each transformer can declare other transformers it must go before or after, and then is given the opportunity to modify the entirety of the DSL it is extending up to that point. This allows extensions to make rich modifications to the structure in question. See
Spark.Dsl.Transformer
for more information
Introspection
Use functions in
Spark.Dsl.Extension
to retrieve the stored values from the DSL and expose them in a module. The convention is to place functions for something like
MyApp.MyExtension
in
MyApp.MyExtension.Info
. Using introspection functions like this allows for a richer introspection API (i.e not just getting and retrieving raw values), and it also allows us to add type specs and documentation, which is helpful when working generically. I.e
module_as_variable.table()
can’t be known by dialyzer, whereas
Extension.table(module)
can be.