|  |  |  |  | 
Object types: Opaque struct types are used for what HarfBuzz loosely calls "objects." This doesn’t have much to do with the terminology from object-oriented programming (OOP), although some of the concepts are similar.
      In HarfBuzz, all object types provide certain
      lifecycle-management APIs.  Objects are reference-counted, and
      constructed with various create() methods, referenced via
      reference() and dereferenced using
      destroy().
    
      For example,
      the hb_buffer_t object has
      hb_buffer_create() as its constructor,
      hb_buffer_reference() to reference, and
      hb_buffer_destroy() to dereference.
    
After construction, each object's properties are accessible only through the setter and getter functions described in the API Reference manual.
Note that many object types can be marked as read-only or immutable, facilitating their use in multi-threaded environments.
Key object types provided by HarfBuzz include:
blobs, which act as low-level wrappers around binary data. Blobs are typically used to hold the contents of a binary font file.
faces, which represent typefaces from a font file, but without specific parameters (such as size) set.
fonts, which represent instances of a face with all of their parameters specified.
buffers, which hold Unicode code points for characters (before shaping) and the shaped glyph output (after shaping).
shape plans, which store the settings that HarfBuzz will use when shaping a particular text segment. Shape plans are not generally used by client programs directly, but as we will see in a later chapter, they are still valuable to understand.