static JSObject*
CreateInterfacePrototypeObject(JSContext* cx, JSObject* global,
                               JSObject* parentProto, JSClass* protoClass,
                               JSFunctionSpec* methods,
                               JSPropertySpec* properties,
                               ConstantSpec* constants)
{
  JSObject* ourProto = JS_NewObjectWithUniqueType(cx, protoClass, parentProto,
                                                  global);
  if (!ourProto) {
    return NULL;
  }

  if (methods && !JS_DefineFunctions(cx, ourProto, methods)) {
    return NULL;
  }

  if (properties && !JS_DefineProperties(cx, ourProto, properties)) {
    return NULL;
  }

  if (constants && !DefineConstants(cx, ourProto, constants)) {
    return NULL;
  }

  return ourProto;
}
static JSObject*
CreateInterfaceObject(JSContext* cx, JSObject* global, JSObject* receiver,
                      JSClass* constructorClass, JSObject* proto,
                      JSFunctionSpec* staticMethods, ConstantSpec* constants,
                      const char* name)
{
  JSObject* functionProto = JS_GetFunctionPrototype(cx, global);
  if (!functionProto) {
    return NULL;
  }

  JSObject* constructor =
    JS_NewObject(cx, constructorClass, functionProto, global);
  if (!constructor) {
    return NULL;
  }

  if (staticMethods && !JS_DefineFunctions(cx, constructor, staticMethods)) {
    return NULL;
  }

  if (constants && !DefineConstants(cx, constructor, constants)) {
    return NULL;
  }

  if (proto && !JS_LinkConstructorAndPrototype(cx, constructor, proto)) {
    return NULL;
  }

  // This is Enumerable: False per spec.
  if (!JS_DefineProperty(cx, receiver, name, OBJECT_TO_JSVAL(constructor), NULL,
                         NULL, 0)) {
    return NULL;
  }

  return constructor;
}
static inline bool
Define(JSContext* cx, JSObject* obj, ConstantSpec* spec) {
  return DefineConstants(cx, obj, spec);
}