00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00063 @implementation CPObject
00064 {
00065 Class isa;
00066 }
00067
00068 + (void)load
00069 {
00070 }
00071
00072 + (void)initialize
00073 {
00074
00075 }
00076
00081 + (id)new
00082 {
00083 return [[self alloc] init];
00084 }
00085
00089 + (id)alloc
00090 {
00091
00092 return class_createInstance(self);
00093 }
00094
00099 - (id)init
00100 {
00101 return self;
00102 }
00103
00108 - (id)copy
00109 {
00110 return self;
00111 }
00112
00117 - (id)mutableCopy
00118 {
00119 return [self copy];
00120 }
00121
00125 - (void)dealloc
00126 {
00127 }
00128
00129
00133 + (Class)class
00134 {
00135 return self;
00136 }
00137
00141 - (Class)class
00142 {
00143 return isa;
00144 }
00145
00149 + (Class)superclass
00150 {
00151 return super_class;
00152 }
00153
00158 + (BOOL)isSubclassOfClass:(Class)aClass
00159 {
00160 var theClass = self;
00161
00162 for(; theClass; theClass = theClass.super_class)
00163 if(theClass === aClass)
00164 return YES;
00165
00166 return NO;
00167 }
00168
00173 - (BOOL)isKindOfClass:(Class)aClass
00174 {
00175 return [isa isSubclassOfClass:aClass];
00176 }
00177
00178 + (BOOL)isKindOfClass:(Class)aClass
00179 {
00180 return [self isSubclassOfClass:aClass];
00181 }
00182
00187 - (BOOL)isMemberOfClass:(Class)aClass
00188 {
00189 return self.isa === aClass;
00190 }
00191
00192 + (BOOL)isMemberOfClass:(Class)aClass
00193 {
00194 return self === aClass;
00195 }
00196
00201 - (BOOL)isProxy
00202 {
00203 return NO;
00204 }
00205
00206
00212 + (BOOL)instancesRespondToSelector:(SEL)aSelector
00213 {
00214 return !!class_getInstanceMethod(self, aSelector);
00215 }
00216
00222 - (BOOL)respondsToSelector:(SEL)aSelector
00223 {
00224 return !!class_getInstanceMethod(isa, aSelector);
00225 }
00226
00227
00228
00234 - (IMP)methodForSelector:(SEL)aSelector
00235 {
00236 return class_getMethodImplementation(isa, aSelector);
00237 }
00238
00244 + (IMP)instanceMethodForSelector:(SEL)aSelector
00245 {
00246 return class_getMethodImplementation(self, aSelector);
00247 }
00248
00254 - (CPMethodSignature)methodSignatureForSelector:(SEL)aSelector
00255 {
00256
00257 return nil;
00258 }
00259
00260
00264 - (CPString)description
00265 {
00266 return "<" + isa.name + " 0x" + [CPString stringWithHash:[self hash]] + ">";
00267 }
00268
00269
00275 - (id)performSelector:(SEL)aSelector
00276 {
00277 return objj_msgSend(self, aSelector);
00278 }
00279
00286 - (id)performSelector:(SEL)aSelector withObject:(id)anObject
00287 {
00288 return objj_msgSend(self, aSelector, anObject);
00289 }
00290
00298 - (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject
00299 {
00300 return objj_msgSend(self, aSelector, anObject, anotherObject);
00301 }
00302
00303
00310 - (void)forwardInvocation:(CPInvocation)anInvocation
00311 {
00312 [self doesNotRecognizeSelector:[anInvocation selector]];
00313 }
00314
00319 - (void)forward:(SEL)aSelector :(marg_list)args
00320 {
00321 var signature = [self methodSignatureForSelector:aSelector];
00322
00323 if (signature)
00324 {
00325 invocation = [CPInvocation invocationWithMethodSignature:signature];
00326
00327 [invocation setTarget:self];
00328 [invocation setSelector:aSelector];
00329
00330 var index = 2,
00331 count = args.length;
00332
00333 for (; index < count; ++index)
00334 [invocation setArgument:args[index] atIndex:index];
00335
00336 [self forwardInvocation:invocation];
00337
00338 return [invocation returnValue];
00339 }
00340
00341 [self doesNotRecognizeSelector:aSelector];
00342 }
00343
00344
00350 - (void)doesNotRecognizeSelector:(SEL)aSelector
00351 {
00352 [CPException raise:CPInvalidArgumentException reason:
00353 (class_isMetaClass(isa) ? "+" : "-") + " [" + [self className] + " " + aSelector + "] unrecognized selector sent to " +
00354 (class_isMetaClass(isa) ? "class" : "instance") + " 0x" + [CPString stringWithHash:[self hash]]];
00355 }
00356
00357
00366 - (id)awakeAfterUsingCoder:(CPCoder)aCoder
00367 {
00368 return self;
00369 }
00370
00375 - (Class)classForKeyedArchiver
00376 {
00377 return [self classForCoder];
00378 }
00379
00384 - (Class)classForCoder
00385 {
00386 return [self class];
00387 }
00388
00394 - (id)replacementObjectForArchiver:(CPArchiver)anArchiver
00395 {
00396 return [self replacementObjectForCoder:anArchiver];
00397 }
00398
00404 - (id)replacementObjectForKeyedArchiver:(CPKeyedArchiver)anArchiver
00405 {
00406 return [self replacementObjectForCoder:anArchiver];
00407 }
00408
00414 - (id)replacementObjectForCoder:(CPCoder)aCoder
00415 {
00416 return self;
00417 }
00418
00423 + (id)setVersion:(int)aVersion
00424 {
00425 version = aVersion;
00426
00427 return self;
00428 }
00429
00433 + (int)version
00434 {
00435 return version;
00436 }
00437
00438
00442 - (CPString)className
00443 {
00444 return isa.name;
00445 }
00446
00447
00452 - (id)autorelease
00453 {
00454 return self;
00455 }
00456
00460 - (unsigned)hash
00461 {
00462 return __address;
00463 }
00464
00469 - (BOOL)isEqual:(id)anObject
00470 {
00471 return self === anObject || [self hash] === [anObject hash];
00472 }
00473
00478 - (id)retain
00479 {
00480 return self;
00481 }
00482
00486 - (void)release
00487 {
00488 }
00489
00493 - (id)self
00494 {
00495 return self;
00496 }
00497
00501 - (Class)superclass
00502 {
00503 return isa.super_class;
00504 }
00505
00506 @end
00507
00508
00509
00510 objj_object.prototype.toString = function()
00511 {
00512 if (this.isa && class_getInstanceMethod(this.isa, "description") != NULL)
00513 return [this description]
00514 else
00515 return String(this) + " (-description not implemented)";
00516 }