ufoLib
------
- UFOReader
  - need to add up-conversion for kerning and kerning groups
    - this needs to be done in three different methods:
      - readInfo
        - default suffixes can be set in __init__
      - readGroups
        - maybe skim the kerning for referenced groups and rename on the fly.
          this creates a race condition of sorts in that he kerning could be modified
          after the groups have been read. there isn't any way around this. maybe the
          doc should say that for < version 3 kerning and groups should always be read
          at the same time.
      - readKerning
        - need to temporarily read the groups for conversion. see above.
  - readInfo
    - double check to make sure that no conversion is needed
    - add support for new attributes
  - add a method for getting the images path
  - add a method for getting the directory path
  - add a getLayerNames method
    - how will this handle indicating that a layer is the default?
  - getGlyphSet
    - add a layerName=None argument

- UFOWriter
  - change default version
  - writeInfo
    - need down-convert function to filter out >= 3 attributes
    - add support for new attributes
  - writeKerning and writeGroups
    - down conversion of modified group names is going to be a problem
      when writing into an existing < 3 file.
  - getGlyphSet
    - add layerName=None argument
      - add the user name to file name conversion abstraction to glifLib
    - add an isDefaultLayer=True (or something) argument for when the default layer has a name
    - update layercontents.plist each time a glyph set is created or make the caller do it?
  - add a method for getting the images path
  - add a method for getting the directory path
  - change the directory mod time for each write

- build version 3 attribute definitions
  - maybe do a dynamic copy of the version 2 data
- update validation functions

- are the in place version converters necessary?


glifLib
-------
X roll in server optimizations
- make GlyphSet a new style class
- GlyphSet
  - add a readLayerInfo(info) method
  - add a writeLayerInfo(info) method
  - writeGlyph
    - need to support guides
      - glyph object must have a list like object located at the guidelines attribute.
        the objects returned from that object must have a dict like behavior.
        API sketch:
          for guideline in glyph.guidelines:
            x = guideline["x"]
            y = guideline["y"]
            ...
      - need to support images
        - glyph object must have a dict like object located at the image attribute.
          API sketch:
            fileName = glyph.image["fileName"]
            xScale = glyph.image["xScale"]
  - readGlyph
    - need to support guides
      - glyph object must accept a list of dicts at the guidelines attribute.
        API sketch:
          glyph.guidelines = [
            dict(x=100, y=100, angle=12.3, name="name", color="0,0,0,1", identified="identifier1"),
            dict(x=100, y=100, angle=12.3, name="name", color="0,0,0,1", identified="identifier2")
          ]
    - need to support images
      - glyph object must accept a dict at the image attribute.
        API sketch:
          glyph.image = dict(fileName="foo.png", xScale=1, yScale=1, ..., color="1,0,0,0.5")

- GLIFPointPen
  - update to new API

- writeGlyphToString needs to be adapted
  - add a formatVersion=3 argument
- add a buildOutline_Format2 function

- add the user name to file name conversion from the UFO spec

- don't write "180.0"


point pen protocol
------------------
- add an identifier=None to the beginPath method
- add an identifier=None to the addComponent method
- add an identifier=None to the addPoint method?
- add **kwargs to beginPath and addComponent?
