001    package org.bridj.objc;
002    
003    import org.bridj.NativeObject;
004    import org.bridj.Pointer;
005    import static org.bridj.Pointer.*;
006    import org.bridj.BridJ;
007    
008    @org.bridj.ann.Runtime(ObjectiveCRuntime.class)
009    public class ObjCObject extends NativeObject {
010            static {
011                    BridJ.register();
012            }
013            
014        ObjCObject type;
015    
016        //public native <T extends ObjCObject> Pointer<T> create();
017        public native <T extends ObjCObject> Pointer<T> init();
018        public native Pointer<NSString> stringValue(); 
019        public native Pointer<NSString> description(); 
020        
021        public native int hash();
022        public native boolean isEqual(Pointer<? extends ObjCObject> anObject);
023    
024            public native boolean isKindOf(Pointer<? extends ObjCObject> aClassObject);
025            public native boolean isMemberOf(Pointer<? extends ObjCObject> aClassObject);
026            public native boolean isKindOfClassNamed(Pointer<Byte> aClassName);
027            public native boolean isMemberOfClassNamed(Pointer<Byte> aClassName);
028    
029            public native boolean respondsTo(SEL aSelector);
030            public native IMP methodFor(SEL aSelector);
031            
032            public native Pointer<?> perform(SEL aSelector);
033            public native Pointer<?> perform$with(SEL aSelector, Pointer<?> anObject);
034            public native Pointer<?> perform$with$with(SEL aSelector, Pointer<?> object1, Pointer<?> object2);
035    
036        public ObjCObject(Pointer<? extends NativeObject> peer) {
037            super(peer);
038        }
039    
040        public ObjCObject() {
041            super();
042        }
043    
044        public ObjCObject(int constructorId, Object... args) {
045            super(constructorId, args);
046        }
047        
048        @Override
049        public String toString() {
050                    Pointer<NSString> p = description();
051                    if (p == null)
052                            p = stringValue();
053                    
054                    return p.get().toString();
055        }
056        @Override
057        public boolean equals(Object o) {
058                    if (!(o instanceof ObjCObject))
059                            return false;
060                    
061                    Pointer<ObjCObject> p = pointerTo((ObjCObject)o);
062                    return isEqual(p);
063        }
064        @Override
065        public int hashCode() {
066                    return hash();
067        }
068    }