<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>src/ikj/main/ioke/lang/util/ObjectProxyCache.java</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -8,18 +8,41 @@ import java.util.Map;
 import java.util.IdentityHashMap;
 
 import ioke.lang.exceptions.ControlFlow;
-import ioke.lang.util.WeakIdentityHashMap;
+import ioke.lang.util.ObjectProxyCache;
 
 /**
  *
  * @author &lt;a href=&quot;mailto:ola.bini@gmail.com&quot;&gt;Ola Bini&lt;/a&gt;
  */
 public class IokeRegistry {
+    private static interface Creator {
+        IokeObject create(Object javaObject);
+    }
+    
     public Runtime runtime;
-    private Map wrappedObjects = new WeakIdentityHashMap();
+    private Creator regularCreator;
+    private Creator integratedCreator;
 
-    public IokeRegistry(Runtime runtime) {
+    private final ObjectProxyCache&lt;IokeObject, Creator&gt; wrappedObjects = 
+        new ObjectProxyCache&lt;IokeObject, Creator&gt;(ObjectProxyCache.ReferenceType.WEAK) {
+
+        public IokeObject allocateProxy(Object javaObject, Creator creator) {
+            return creator.create(javaObject);
+        }
+    };
+
+    public IokeRegistry(final Runtime runtime) {
         this.runtime = runtime;
+        this.regularCreator = new Creator() {
+                public IokeObject create(Object javaObject) {
+                    return runtime.createJavaWrapper(javaObject);
+                }
+            };
+        this.integratedCreator = new Creator() {
+                public IokeObject create(Object javaObject) {
+                    return runtime.createIntegratedJavaWrapper((Class)javaObject);
+                }
+            };
     }
     
     public static void makeWrapped(Object on, IokeObject wrapped, IokeObject context) {
@@ -39,12 +62,7 @@ public class IokeRegistry {
             return ((Boolean)on).booleanValue() ? runtime._true : runtime._false;
         }
         
-        IokeObject obj = (IokeObject)wrappedObjects.get(on);
-        if(obj == null) {
-            obj = runtime.createJavaWrapper(on);
-            wrappedObjects.put(on, obj);
-        }
-        return obj;
+        return wrappedObjects.getOrCreate(on, regularCreator);
     }
 
     public IokeObject integratedWrap(Class on) {
@@ -52,16 +70,11 @@ public class IokeRegistry {
             return runtime.nil;
         }
         
-        IokeObject obj = (IokeObject)wrappedObjects.get(on);
-        if(obj == null) {
-            obj = runtime.createIntegratedJavaWrapper(on);
-            wrappedObjects.put(on, obj);
-        }
-        return obj;
+        return wrappedObjects.getOrCreate(on, integratedCreator);
     }
 
     public boolean isWrapped(Object on) {
-        return wrappedObjects.containsKey(on);
+        return wrappedObjects.get(on) != null;
     }
 
     public static boolean isWrapped(Object on, IokeObject context) {</diff>
      <filename>src/ikj/main/ioke/lang/IokeRegistry.java</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>src/ikj/main/ioke/lang/util/GenericMap.java</filename>
    </removed>
    <removed>
      <filename>src/ikj/main/ioke/lang/util/WeakIdentityHashMap.java</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>4aaf43ab157c7c62cc4ab948894bafb7bf9a8b67</id>
    </parent>
  </parents>
  <author>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </author>
  <url>http://github.com/olabini/ioke/commit/87e67975b9bb30a00dbef97b72088e7e4fb9f12a</url>
  <id>87e67975b9bb30a00dbef97b72088e7e4fb9f12a</id>
  <committed-date>2009-06-01T12:07:24-07:00</committed-date>
  <authored-date>2009-06-01T12:07:24-07:00</authored-date>
  <message>Fix memory leak by having a real ObjectProxyCache</message>
  <tree>8373fd7788e84b34fc51487a8fbbc1de1d238ca9</tree>
  <committer>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </committer>
</commit>
