# File lib/marc/writer.rb, line 38
    def self.encode(record)
      directory = ''
      fields = ''
      offset = 0
      for field in record.fields

        # encode the field
        field_data = ''
        if field.class == MARC::DataField 
          field_data = field.indicator1 + field.indicator2 
          for s in field.subfields
            field_data += SUBFIELD_INDICATOR + s.code + s.value
          end
        elsif field.class == MARC::ControlField
          field_data = field.value
        end
        field_data += END_OF_FIELD

        # calculate directory entry for the field
        field_length = field_data.length()
        directory += sprintf("%03s%04i%05i", field.tag, field_length, 
          offset)

        # add field to data for other fields
        fields += field_data 

        # update offset for next field
        offset += field_length
      end

      # determine the base (leader + directory)
      base = record.leader + directory + END_OF_FIELD

      # determine complete record
      marc = base + fields + END_OF_RECORD

      # update leader with the byte offest to the end of the directory
      marc[12..16] = sprintf("%05i", base.length())

      # update the record length
      marc[0..4] = sprintf("%05i", marc.length())
      
      # store updated leader in the record that was passed in
      record.leader = marc[0..LEADER_LENGTH-1]

      # return encoded marc
      return marc 
    end