|
3f27fca5
»
|
tolmasky |
2009-06-04 |
Added support for custom cl... |
1 |
var NSClassSwapperClassNames = {}, |
| |
2 |
NSClassSwapperOriginalClassNames = {}; |
| |
3 |
|
| |
4 |
var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey", |
| |
5 |
_CPCibClassSwapperOriginalClassNameKey = @"_CPCibClassSwapperOriginalClassNameKey"; |
| |
6 |
|
| |
7 |
@implementation NSClassSwapper : _CPCibClassSwapper |
| |
8 |
{ |
| |
9 |
} |
| |
10 |
|
| |
11 |
+ (id)swapperClassForClassName:(CPString)aClassName originalClassName:(CPString)anOriginalClassName |
| |
12 |
{ |
| |
13 |
var swapperClassName = "$NSClassSwapper_" + aClassName + "_" + anOriginalClassName; |
| |
14 |
swapperClass = objj_lookUpClass(swapperClassName); |
| |
15 |
|
| |
16 |
if (!swapperClass) |
| |
17 |
{ |
| |
18 |
var originalClass = objj_lookUpClass(anOriginalClassName); |
| |
19 |
|
| |
20 |
swapperClass = objj_allocateClassPair(originalClass, swapperClassName); |
| |
21 |
|
| |
22 |
objj_registerClassPair(swapperClass); |
| |
23 |
|
|
c42fb68d
»
|
tolmasky |
2009-06-05 |
Made class swapping more ro... |
24 |
class_addMethod(swapperClass, @selector(initWithCoder:), function(self, _cmd, aCoder) |
|
3f27fca5
»
|
tolmasky |
2009-06-04 |
Added support for custom cl... |
25 |
{ |
| |
26 |
self = objj_msgSendSuper({super_class:originalClass, receiver:self}, _cmd, aCoder); |
| |
27 |
|
| |
28 |
if (self) |
| |
29 |
{ |
| |
30 |
var UID = [self UID]; |
| |
31 |
|
| |
32 |
NSClassSwapperClassNames[UID] = aClassName; |
| |
33 |
NSClassSwapperOriginalClassNames[UID] = anOriginalClassName; |
| |
34 |
} |
| |
35 |
|
| |
36 |
return self; |
| |
37 |
}, ""); |
| |
38 |
|
|
c42fb68d
»
|
tolmasky |
2009-06-05 |
Made class swapping more ro... |
39 |
class_addMethod(swapperClass, @selector(classForKeyedArchiver), function(self, _cmd) |
|
3f27fca5
»
|
tolmasky |
2009-06-04 |
Added support for custom cl... |
40 |
{ |
| |
41 |
return [_CPCibClassSwapper class]; |
| |
42 |
}, ""); |
| |
43 |
|
| |
44 |
class_addMethod(swapperClass, @selector(encodeWithCoder:), function(self, _cmd, aCoder) |
| |
45 |
{ |
| |
46 |
objj_msgSendSuper({super_class:originalClass, receiver:self}, _cmd, aCoder); |
| |
47 |
|
| |
48 |
// FIXME: map class name as well? |
| |
49 |
[aCoder encodeObject:aClassName forKey:_CPCibClassSwapperClassNameKey]; |
| |
50 |
[aCoder encodeObject:CP_NSMapClassName(anOriginalClassName) forKey:_CPCibClassSwapperOriginalClassNameKey]; |
| |
51 |
}, ""); |
|
c42fb68d
»
|
tolmasky |
2009-06-05 |
Made class swapping more ro... |
52 |
} |
|
3f27fca5
»
|
tolmasky |
2009-06-04 |
Added support for custom cl... |
53 |
|
| |
54 |
return swapperClass; |
| |
55 |
} |
| |
56 |
|
| |
57 |
+ (id)allocWithCoder:(CPCoder)aCoder |
| |
58 |
{ |
| |
59 |
var className = [aCoder decodeObjectForKey:@"NSClassName"], |
| |
60 |
originalClassName = [aCoder decodeObjectForKey:@"NSOriginalClassName"]; |
| |
61 |
|
| |
62 |
return [[self swapperClassForClassName:className originalClassName:originalClassName] alloc]; |
| |
63 |
} |
| |
64 |
|
| |
65 |
@end |
| |
66 |
|