diff --git a/lib/modules/Array.pmod b/lib/modules/Array.pmod
index 604c6fee811f52fb45dd965c1f6d0cd23e07656c..b16aad3d64cf2843ccca3f3e26b60f825c50b258 100644
--- a/lib/modules/Array.pmod
+++ b/lib/modules/Array.pmod
@@ -5,24 +5,28 @@ mixed map(mixed arr, mixed fun, mixed ... args)
   int e;
   mixed *ret;
 
-  if(mappingp(arr))
+  switch(sprintf("%t",fun))
+  {
+  case "mapping":
     return mkmapping(indices(arr),map(values(arr),fun,@args));
 
-  if(intp(fun))
+  case "int":
     return arr(@args);
-  
-  if(stringp(fun))
+
+  case "string":
     return column(arr, fun)(@args);
 
-  if(functionp(fun))
-  {
+  case "function":
+  case "program":
+  case "object":
     ret=allocate(sizeof(arr));
     for(e=0;e<sizeof(arr);e++)
       ret[e]=fun(arr[e],@args);
     return ret;
-  }
 
-  error("Bad argument 2 to map_array().\n");
+  default:
+    error("Bad argument 2 to map_array().\n");
+  }
 }
 
 mixed filter(mixed arr, mixed fun, mixed ... args)