def write_to(io)
      write_sc(io, conformance)
      write_sc(io, 'profile', profile)
      prefixes.each { |prefix, url| write_sc(io, 'prefix', "#{prefix}:", url) }
      write_sc(io, 'fields', *fields)
      entries.each { |entry| io.puts(entry_line(entry)) }
      write_sc(io, 'eof')
    end
def write_to(io)
      write_sc(io, conformance)
      write_sc(io, 'profile', profile)
      prefixes.each { |prefix, url| write_sc(io, 'prefix', "#{prefix}:", url) }
      write_sc(io, 'fields', *fields)
      entries.each { |entry| io.puts(entry_line(entry)) }
      write_sc(io, 'eof')
    end
Creates a new manifest. Note that the prefix, field, and entry arrays are
 copied on initialization, as are the individual entry hashes.

 @param conformance [String] the conformance level. Defaults to {CHECKM_0_7}.
 @param profile [URI, String] the profile URI. Must begin with
 @param prefixes [Hash{String,Symbol => URI, String}] a map from namespace prefixes to their URIs
 @param fields Array<String> a list of field names, in the form prefix:fieldname
 @param entries [Array<Hash<String, Object><] A list of entries, each of which is a hash keyed by
   a prefixed fieldname defined in `fields`. Nil values are allowed.
 @raise [ArgumentError] if `profile` does not begin with {PROFILE_BASE_URI}
 @raise [ArgumentError] if `fields` cannot be parsed as prefix:fieldname, or if one or more prefixes
   is not mapped to a URI in `prefixes`
 @raise [URI::InvalidURIError] if `profile` cannot be parsed as a URI
 Writes this manifest to the specified IO
 @param io [IO] the IO to write to