module Asciidoctor::Extensions::SyntaxProcessorDsl

def content_model value

def content_model value
  option :content_model, value
end

def default_attributes value

def default_attributes value
  option :default_attrs, value
end

def named value

def named value
  # NOTE due to how processors get initialized, we must defer this assignment in some scenarios
  if Processor === self
    @name = value
  else
    option :name, value
  end
end

def positional_attributes *value

def positional_attributes *value
  option :positional_attrs, value.flatten
end

def resolve_attributes *args

def resolve_attributes *args
  # NOTE assume true as default value; rewrap single-argument string or symbol
  if (args = args.fetch 0, true).respond_to? :to_sym
    args = [args]
  end unless args.size > 1
  case args
  when true
    option :positional_attrs, []
    option :default_attrs, {}
  when ::Array
    names, defaults = [], {}
    args.each do |arg|
      if (arg = arg.to_s).include? '='
        name, _, value = arg.partition '='
        if name.include? ':'
          idx, _, name = name.partition ':'
          idx = idx == '@' ? names.size : idx.to_i
          names[idx] = name
        end
        defaults[name] = value
      elsif arg.include? ':'
        idx, _, name = arg.partition ':'
        idx = idx == '@' ? names.size : idx.to_i
        names[idx] = name
      else
        names << arg
      end
    end
    option :positional_attrs, names.compact
    option :default_attrs, defaults
  when ::Hash
    names, defaults = [], {}
    args.each do |key, val|
      if (name = key.to_s).include? ':'
        idx, _, name = name.partition ':'
        idx = idx == '@' ? names.size : idx.to_i
        names[idx] = name
      end
      defaults[name] = val if val
    end
    option :positional_attrs, names.compact
    option :default_attrs, defaults
  else
    raise ::ArgumentError, %(unsupported attributes specification for macro: #{args.inspect})
  end
end