lib/diesel/package.ex

defmodule Diesel.Package do
  @moduledoc """
  Packages extend DSLs by defining new tags.

  Usage:

  ```elixir
  defmodule Latex.Dsl.Music do
    use Diesel.Package,
      tags: [
        :music,
        :instrument,
        :meter
      ]
  end
  ```
  """

  @callback tags() :: [atom()]
  @callback compiler() :: Macro.t()
  @optional_callbacks compiler: 0

  defmacro __using__(opts) do
    tags = Keyword.fetch!(opts, :tags)

    quote do
      @behaviour Diesel.Package

      @impl Diesel.Package
      def tags, do: unquote(tags)
    end
  end
end