Returns a getOption function that extracts property value for given
options object. If property is missing it returns defaultValue. If value
is out of range for that property it throws RangeError.
function getGetOption(options, caller) {
  if (IS_UNDEFINED(options)) throw MakeError(kDefaultOptionsMissing, caller);

  var getOption = function getOption(property, type, values, defaultValue) {
    if (!IS_UNDEFINED(options[property])) {
      var value = options[property];
      switch (type) {
        case 'boolean':
          value = TO_BOOLEAN(value);
          break;
        case 'string':
          value = TO_STRING(value);
          break;
        case 'number':
          value = TO_NUMBER(value);
          break;
        default:
          throw MakeError(kWrongValueType);
      }

      if (!IS_UNDEFINED(values) && %_Call(ArrayIndexOf, values, value) === -1) {
        throw MakeRangeError(kValueOutOfRange, value, caller, property);
      }

      return value;
    }

    return defaultValue;
  }

  return getOption;
}