Added methods as_Menu and as_Control to convert a resource
to those object types

You can now set the data attribute of a resource with the expected
semantics (but you have to call ChangedResource yourself)
diff --git a/Mac/Modules/res/Resmodule.c b/Mac/Modules/res/Resmodule.c
index 3c5b23d..d3ec0ea 100644
--- a/Mac/Modules/res/Resmodule.c
+++ b/Mac/Modules/res/Resmodule.c
@@ -403,6 +403,26 @@
 	return _res;
 }
 
+static PyObject *ResObj_as_Control(_self, _args)
+	ResourceObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+
+	return CtlObj_New((ControlHandle)_self->ob_itself);
+
+}
+
+static PyObject *ResObj_as_Menu(_self, _args)
+	ResourceObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+
+	return MenuObj_New((MenuHandle)_self->ob_itself);
+
+}
+
 static PyMethodDef ResObj_methods[] = {
 	{"HomeResFile", (PyCFunction)ResObj_HomeResFile, 1,
 	 "() -> (short _rv)"},
@@ -438,6 +458,10 @@
 	 "(long newSize) -> None"},
 	{"GetNextFOND", (PyCFunction)ResObj_GetNextFOND, 1,
 	 "() -> (Handle _rv)"},
+	{"as_Control", (PyCFunction)ResObj_as_Control, 1,
+	 "Return this resource/handle as a Control"},
+	{"as_Menu", (PyCFunction)ResObj_as_Menu, 1,
+	 "Return this resource/handle as a Menu"},
 	{NULL, NULL, 0}
 };
 
@@ -468,7 +492,32 @@
 	return Py_FindMethodInChain(&ResObj_chain, (PyObject *)self, name);
 }
 
-#define ResObj_setattr NULL
+static int
+ResObj_setattr(self, name, value)
+	ResourceObject *self;
+	char *name;
+	PyObject *value;
+{
+	char *data;
+	long size;
+	
+	if (strcmp(name, "data") != 0 || value == NULL )
+		return -1;
+	if ( !PyString_Check(value) )
+		return -1;
+	size = PyString_Size(value);
+	data = PyString_AsString(value);
+	/* XXXX Do I need the GetState/SetState calls? */
+	SetHandleSize(self->ob_itself, size);
+	if ( MemError())
+		return -1;
+	HLock(self->ob_itself);
+	memcpy((char *)*self->ob_itself, data, size);
+	HUnlock(self->ob_itself);
+	/* XXXX Should I do the Changed call immedeately? */
+	return 0;
+}
+
 
 PyTypeObject Resource_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Mac/Modules/res/resedit.py b/Mac/Modules/res/resedit.py
index 5e54ef2..bffec5f 100644
--- a/Mac/Modules/res/resedit.py
+++ b/Mac/Modules/res/resedit.py
@@ -23,3 +23,19 @@
 Apply AddResource() to write it to a resource file.
 """
 functions.append(f)
+
+# Convert resources to other things.
+
+as_xxx_body = """
+return %sObj_New((%sHandle)_self->ob_itself);
+"""
+
+def genresconverter(longname, shortname):
+
+	f = ManualGenerator("as_%s"%longname, as_xxx_body%(shortname, longname))
+	docstring =  "Return this resource/handle as a %s"%longname
+	f.docstring = lambda docstring=docstring: docstring
+	return f
+
+resmethods.append(genresconverter("Control", "Ctl"))
+resmethods.append(genresconverter("Menu", "Menu"))
diff --git a/Mac/Modules/res/ressupport.py b/Mac/Modules/res/ressupport.py
index efc7571..e2bfa79 100644
--- a/Mac/Modules/res/ressupport.py
+++ b/Mac/Modules/res/ressupport.py
@@ -56,6 +56,34 @@
 	return Py_BuildValue("[ss]", "data", "size");
 """
 
+setattrCode = """
+static int
+ResObj_setattr(self, name, value)
+	ResourceObject *self;
+	char *name;
+	PyObject *value;
+{
+	char *data;
+	long size;
+	
+	if (strcmp(name, "data") != 0 || value == NULL )
+		return -1;
+	if ( !PyString_Check(value) )
+		return -1;
+	size = PyString_Size(value);
+	data = PyString_AsString(value);
+	/* XXXX Do I need the GetState/SetState calls? */
+	SetHandleSize(self->ob_itself, size);
+	if ( MemError())
+		return -1;
+	HLock(self->ob_itself);
+	memcpy((char *)*self->ob_itself, data, size);
+	HUnlock(self->ob_itself);
+	/* XXXX Should I do the Changed call immedeately? */
+	return 0;
+}
+"""
+
 class ResDefiniton(GlobalObjectDefinition):
 
 	def outputCheckNewArg(self):
@@ -63,6 +91,9 @@
 
 	def outputGetattrHook(self):
 		Output(getattrHookCode)
+		
+	def outputSetattr(self):
+		Output(setattrCode)
 
 
 resobject = ResDefiniton('Resource', 'ResObj', 'Handle')