whole_func_string: 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))
    }
  }
func_code_string: 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))
    }
  }
func_documentation_string: XXX: should this be a feature of atom?