00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00029 @implementation CPObject
00030 {
00031 Class isa;
00032 }
00033
00034 + (void)load
00035 {
00036 }
00037
00038 + (void)initialize
00039 {
00040
00041 }
00042
00047 + (id)new
00048 {
00049 return [[self alloc] init];
00050 }
00051
00055 + (id)alloc
00056 {
00057
00058 return class_createInstance(self);
00059 }
00060
00065 - (id)init
00066 {
00067 return self;
00068 }
00069
00074 - (id)copy
00075 {
00076 return self;
00077 }
00078
00083 - (id)mutableCopy
00084 {
00085 return [self copy];
00086 }
00087
00091 - (void)dealloc
00092 {
00093 }
00094
00095
00099 + (Class)class
00100 {
00101 return self;
00102 }
00103
00107 - (Class)class
00108 {
00109 return isa;
00110 }
00111
00115 + (Class)superclass
00116 {
00117 return super_class;
00118 }
00119
00124 + (BOOL)isSubclassOfClass:(Class)aClass
00125 {
00126 var theClass = self;
00127
00128 for(; theClass; theClass = theClass.super_class)
00129 if(theClass == aClass) return YES;
00130
00131 return NO;
00132 }
00133
00138 - (BOOL)isKindOfClass:(Class)aClass
00139 {
00140 return [isa isSubclassOfClass:aClass];
00141 }
00142
00147 - (BOOL)isMemberOfClass:(Class)aClass
00148 {
00149 return self.isa == aClass;
00150 }
00151
00156 - (BOOL)isProxy
00157 {
00158 return NO;
00159 }
00160
00161
00167 + (BOOL)instancesRespondToSelector:(SEL)aSelector
00168 {
00169 return class_getInstanceMethod(self, aSelector);
00170 }
00171
00177 - (BOOL)respondsToSelector:(SEL)aSelector
00178 {
00179 return class_getInstanceMethod(isa, aSelector) != NULL;
00180 }
00181
00182
00183
00189 - (IMP)methodForSelector:(SEL)aSelector
00190 {
00191 return class_getInstanceMethod(isa, aSelector);
00192 }
00193
00199 + (IMP)instanceMethodForSelector:(SEL)aSelector
00200 {
00201 return class_getInstanceMethod(self, aSelector);
00202 }
00203
00209 - (CPMethodSignature)methodSignatureForSelector:(SEL)aSelector
00210 {
00211
00212 return nil;
00213 }
00214
00215
00219 - (CPString)description
00220 {
00221 return "<" + isa.name + " 0x" + [CPString stringWithHash:[self hash]] + ">";
00222 }
00223
00224
00230 - (id)performSelector:(SEL)aSelector
00231 {
00232 return objj_msgSend(self, aSelector);
00233 }
00234
00241 - (id)performSelector:(SEL)aSelector withObject:(id)anObject
00242 {
00243 return objj_msgSend(self, aSelector, anObject);
00244 }
00245
00253 - (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject
00254 {
00255 return objj_msgSend(self, aSelector, anObject, anotherObject);
00256 }
00257
00258
00265 - (void)forwardInvocation:(CPInvocation)anInvocation
00266 {
00267 [self doesNotRecognizeSelector:[anInvocation selector]];
00268 }
00269
00274 - (void)forward:(SEL)aSelector :(marg_list)args
00275 {
00276 var signature = [self methodSignatureForSelector:aSelector];
00277
00278 if (signature)
00279 {
00280 invocation = [CPInvocation invocationWithMethodSignature:signature];
00281
00282 [invocation setTarget:self];
00283 [invocation setSelector:aSelector];
00284
00285 var index = 2,
00286 count = args.length;
00287
00288 for (; index < count; ++index)
00289 [invocation setArgument:args[index] atIndex:index];
00290
00291 [self forwardInvocation:invocation];
00292
00293 return [invocation returnValue];
00294 }
00295
00296 [self doesNotRecognizeSelector:aSelector];
00297 }
00298
00299
00305 - (void)doesNotRecognizeSelector:(SEL)aSelector
00306 {
00307 [CPException raise:CPInvalidArgumentException reason:
00308 (class_isMetaClass(isa) ? "+" : "-") + " [" + [self className] + " " + aSelector + "] unrecognized selector sent to " +
00309 (class_isMetaClass(isa) ? "class" : "instance") + " 0x" + [CPString stringWithHash:[self hash]]];
00310 }
00311
00312
00321 - (id)awakeAfterUsingCoder:(CPCoder)aCoder
00322 {
00323 return self;
00324 }
00325
00330 - (Class)classForKeyedArchiver
00331 {
00332 return [self classForCoder];
00333 }
00334
00339 - (Class)classForCoder
00340 {
00341 return [self class];
00342 }
00343
00349 - (id)replacementObjectForArchiver:(CPArchiver)anArchiver
00350 {
00351 return [self replacementObjectForCoder:anArchiver];
00352 }
00353
00359 - (id)replacementObjectForKeyedArchiver:(CPKeyedArchiver)anArchiver
00360 {
00361 return [self replacementObjectForCoder:anArchiver];
00362 }
00363
00369 - (id)replacementObjectForCoder:(CPCoder)aCoder
00370 {
00371 return self;
00372 }
00373
00378 + (id)setVersion:(int)aVersion
00379 {
00380 version = aVersion;
00381
00382 return self;
00383 }
00384
00388 + (int)version
00389 {
00390 return version;
00391 }
00392
00393
00397 - (CPString)className
00398 {
00399 return isa.name;
00400 }
00401
00402
00407 - (id)autorelease
00408 {
00409 return self;
00410 }
00411
00415 - (unsigned)hash
00416 {
00417 return __address;
00418 }
00419
00424 - (BOOL)isEqual:(id)anObject
00425 {
00426 return self === anObject || [self hash] === [anObject hash];
00427 }
00428
00433 - (id)retain
00434 {
00435 return self;
00436 }
00437
00441 - (void)release
00442 {
00443 }
00444
00448 - (id)self
00449 {
00450 return self;
00451 }
00452
00456 - (Class)superclass
00457 {
00458 return isa.super_class;
00459 }
00460
00461 @end
00462
00463
00464
00465 objj_object.prototype.toString = function()
00466 {
00467 if (this.isa && class_getInstanceMethod(this.isa, "description") != NULL)
00468 return [this description]
00469 else
00470 return String(this) + " (-description not implemented)";
00471 }