= Register Extensions

== Register one or more extensions

These extensions are registered per document using a callback that feels like a DSL:

[,ruby]
----
Asciidoctor::Extensions.register do
  preprocessor FrontMatterPreprocessor
  tree_processor ShellSessionTreeProcessor
  postprocessor CopyrightFooterPostprocessor
  docinfo_processor TrackingCodeDocinfoProcessor if @document.basebackend? 'html'
  block ShoutBlock
  block_macro GistBlockMacro if @document.basebackend? 'html'
  inline_macro ManInlineMacro
  include_processor UriIncludeProcessor
end
----

Each registered class is instantiated when the [.class]#Asciidoctor::Document# is created.
Alternately, you can pass an instance of the class when registering the extension.

CAUTION: Extension classes must be defined outside of the register block.
If you define an extension class inside the register block, it will result in an error on subsequent invocations.

NOTE: Once an extension class is registered, it is frozen, preventing further modification.

TIP: If you need to store state on a class-based extension instance, assign a new Hash to an instance variable named `@state` in the constructor, then assign data to the keys of that Hash.
If you need other extensions to be able to access that state, define a reader for that instance variable (i.e., `attr_reader :state`).

You can register more than one processor of each type, though you can only have one processor per custom block or macro.
