def enum_source(descriptor):
    """Returns source code defining an enumeration type"""
    name = descriptor.name
    lines = ['// %s enum' % name, 'lua_newtable(L); // proxy table',
        'lua_newtable(L); // main table']
    for value in descriptor.value:
        k = value.name
        v = value.number
        lines.extend(['lua_pushnumber(L, %d);' % v, 
            'lua_setfield(L, -2, "%s");' % k])
    lines.extend(['// define metatable on main table', 'lua_newtable(L);',
        'lua_pushcfunction(L, lua_protobuf_enum_index);',
        'lua_setfield(L, -2, "__index");', 'lua_setmetatable(L, -2);', '',
        '// define metatable on proxy table', 'lua_newtable(L);',
        'lua_pushvalue(L, -2);', 'lua_setfield(L, -2, "__index");',
        'lua_pushcfunction(L, lua_protobuf_enum_newindex);',
        'lua_setfield(L, -2, "__newindex");', 'lua_remove(L, -2);',
        'lua_setmetatable(L, -2);', 'lua_setfield(L, -2, "%s");' % name, 
        '// end %s enum' % name])
    return lines
