View Source Writing Extensions
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.