lib/util/index.js
function freezeProperties(object, prototype) {
  if (!_.isObjectLike(object)) {
    throw new TypeError('freezeProperties requires a valid object to be passed')
  }
  var next = _.isNil(prototype) ? object : prototype
  if (_.isArray(next._frozenProperties)) {
    next._frozenProperties.forEach(function(propName) {
      var prop = object[propName]
      Object.defineProperty(object, propName, {
        configurable: false,
        enumerable: true,
        value: prop,
        writable: false
      })
    })
  }
  if (!_.isNil(Object.getPrototypeOf(next))) {
    freezeProperties(object, Object.getPrototypeOf(next))
  }
}
function freezeProperties(object, prototype) {
  if (!_.isObjectLike(object)) {
    throw new TypeError('freezeProperties requires a valid object to be passed')
  }
  var next = _.isNil(prototype) ? object : prototype
  if (_.isArray(next._frozenProperties)) {
    next._frozenProperties.forEach(function(propName) {
      var prop = object[propName]
      Object.defineProperty(object, propName, {
        configurable: false,
        enumerable: true,
        value: prop,
        writable: false
      })
    })
  }
  if (!_.isNil(Object.getPrototypeOf(next))) {
    freezeProperties(object, Object.getPrototypeOf(next))
  }
}
XXX: should this be a feature of atom?