# File lib/asciidoctor/block.rb, line 50
  def initialize parent, context, opts = {}
    super
    @content_model = opts[:content_model] || DEFAULT_CONTENT_MODEL[context]
    if opts.key? :subs
      # FIXME feels funky; we have to be defensive to get lock_in_subs to honor override
      # FIXME does not resolve substitution groups inside Array (e.g., [:normal])
      if (subs = opts[:subs])
        # e.g., :subs => :defult
        # subs attribute is honored; falls back to opts[:default_subs], then built-in defaults based on context
        if subs == :default
          @default_subs = opts[:default_subs]
        # e.g., :subs => [:quotes]
        # subs attribute is not honored
        elsif ::Array === subs
          @default_subs = subs.dup
          @attributes.delete 'subs'
        # e.g., :subs => :normal or :subs => 'normal'
        # subs attribute is not honored
        else
          @default_subs = nil
          # interpolation is the fastest way to dup subs as a string
          @attributes['subs'] = %(#{subs})
        end
        # resolve the subs eagerly only if subs option is specified
        lock_in_subs
      # e.g., :subs => nil
      else
        # NOTE @subs is initialized as empty array by super constructor
        # prevent subs from being resolved
        @default_subs = []
        @attributes.delete 'subs'
      end
    # defer subs resolution; subs attribute is honored
    else
      # NOTE @subs is initialized as empty array by super constructor
      # QUESTION should we honor :default_subs option (i.e., @default_subs = opts[:default_subs])?
      @default_subs = nil
    end
    if (raw_source = opts[:source]).nil_or_empty?
      @lines = []
    elsif ::String === raw_source
      @lines = Helpers.normalize_lines_from_string raw_source
    else
      @lines = raw_source.dup
    end
  end