+static JSValueRef Type_callAsFunction_enumFor(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
+ if (count != 1)
+ throw CYJSError(context, "incorrect number of arguments to Type.enumFor");
+ Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(_this)));
+
+ CYPool pool;
+
+ JSObjectRef constants(CYCastJSObject(context, arguments[0]));
+
+ // XXX: this is, sadly, going to leak
+ JSPropertyNameArrayRef names(JSObjectCopyPropertyNames(context, constants));
+
+ size_t count(JSPropertyNameArrayGetCount(names));
+
+ sig::Enum type(*internal->type_, count);
+ type.constants = new(pool) sig::Constant[count];
+
+ for (size_t index(0); index != count; ++index) {
+ JSStringRef name(JSPropertyNameArrayGetNameAtIndex(names, index));
+ JSValueRef value(CYGetProperty(context, constants, name));
+ _assert(JSValueGetType(context, value) == kJSTypeNumber);
+ CYUTF8String string(CYPoolUTF8String(pool, context, name));
+ type.constants[index].name = string.data;
+ type.constants[index].value = CYCastDouble(context, value);
+ }
+
+ JSPropertyNameArrayRelease(names);
+
+ return CYMakeType(context, type);
+} CYCatch(NULL) }
+