anchor.diff:          member x.Productions = x.Productions.ValueOrDefault []
       interface DesigntimeFarkle with
           member x.Name = x._Name
  -        member __.ResultingType = typeof<'T>
  +        member __.Metadata = GrammarMetadata.Default
       interface DesigntimeFarkle<'T>
   
   /// <summary>A production. Productions are parts of <see cref="Nonterminal{T}"/>s.</summary>
   /// <typeparam name="T">The type of the objects this production generates.</typeparam>
  -type Production<'T> = internal {
  +and Production<'T> = internal {
       Members: Symbol ImmutableArray
       Fuse: obj [] -> obj
   }
   with
       interface AbstractProduction with
           member x.Members = x.Members
  -        member x.Fuse arguments = x.Fuse arguments
  +        member x.Fuse = x.Fuse
   
   module internal Symbol =
  -    let specialize (x: DesigntimeFarkle): Symbol =
  +    let rec specialize (x: DesigntimeFarkle): Symbol =
           match x with
           | :? Terminal as term -> Choice1Of2 term
           | :? Nonterminal as nont -> Choice2Of2 nont
  +        | :? DesigntimeFarkleWithMetadata as x -> specialize x.InnerDesigntimeFarkle
           | _ -> failwith "Using a custom derivative of the DesigntimeFarkle interface is not allowed."
       let append xs df = ImmutableList.add xs (specialize df)
  +
  +/// <summary>Functions to manipulate `DesigntimeFarkle`s.</summary>
  +/// <remarks>Warning: Specifying any metadata on the grammar has to be done
  +/// only at the topmost <see cref="DesigntimeFarkle{T}"/>. Otherwise they
  +/// will be disregarded.</remarks>
  +module DesigntimeFarkle =
  +
  +    /// Sets a custom `GrammarMetadata` object to a `DesigntimeFarkle<T>`.
  +    let withMetadata metadata df =
  +        {DesigntimeFarkleWithMetadata.Create df with Metadata = metadata} :> DesigntimeFarkle<_>
  +
  +    /// Sets whether the given `DesigntimeFarkle<T>` will be case sensitive.
  +    /// By default it isn't.
  +    let caseSensitive x (df: DesigntimeFarkle<_>) = withMetadata {df.Metadata with CaseSensitive = x} df
  
positive.code: [<CompiledName("AbstractNonterminal")>]
  /// <summary>The base, untyped interface of <see cref="Nonterminal{T}"/>.</summary>
  /// <seealso cref="Nonterminal{T}"/>
  type Nonterminal =
      inherit DesigntimeFarkle
      /// The productions of the nonterminal.
      abstract Productions: AbstractProduction list
  
negative.code: // This software is released under the MIT License.
  // https://opensource.org/licenses/MIT
  
  namespace Farkle.Builder
  
  open Farkle
  open Farkle.Common
  