Skip to content

Commit

Permalink
Update podspec.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jasper Blues committed Sep 6, 2013
1 parent 3a24510 commit 8241edf
Show file tree
Hide file tree
Showing 9 changed files with 2,370 additions and 3,079 deletions.
102 changes: 55 additions & 47 deletions Source/Factory/Block/TyphoonAssembly.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
#import "TyphoonAssemblySelectorAdviser.h"
#import "OCLogTemplate.h"

static NSMutableDictionary *resolveStackForKey;
static NSMutableArray *reservedSelectorsAsStrings;
static NSMutableDictionary* resolveStackForSelector;
static NSMutableArray* reservedSelectorsAsStrings;

@implementation TyphoonAssembly

Expand All @@ -42,38 +42,38 @@ + (TyphoonAssembly*)defaultAssembly
+ (void)load
{
[super load];
resolveStackForKey = [[NSMutableDictionary alloc] init];
[self reserveSelectors];
}

+ (void)reserveSelectors;
{
reservedSelectorsAsStrings = [[NSMutableArray alloc] init];
[self markSelectorReserved:@selector(init)];
[self markSelectorReserved:@selector(cachedDefinitionsForMethodName)];
[self markSelectorReservedFromString:@".cxx_destruct"];
[self markSelectorReserved:@selector(defaultAssembly)];
reservedSelectorsAsStrings = [[NSMutableArray alloc] init];

[self markSelectorReserved:@selector(init)];
[self markSelectorReserved:@selector(cachedDefinitionsForMethodName)];
[self markSelectorReservedFromString:@".cxx_destruct"];
[self markSelectorReserved:@selector(defaultAssembly)];
}

+ (void)markSelectorReserved:(SEL)selector
{
[self markSelectorReservedFromString:NSStringFromSelector(selector)];
[self markSelectorReservedFromString:NSStringFromSelector(selector)];
}

+ (void)markSelectorReservedFromString:(NSString *)stringFromSelector
+ (void)markSelectorReservedFromString:(NSString*)stringFromSelector
{
[reservedSelectorsAsStrings addObject:stringFromSelector];
[reservedSelectorsAsStrings addObject:stringFromSelector];
}

#pragma mark - Instance Method Resolution
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
if ([self shouldProvideDynamicImplementationFor:sel]) {
if ([self shouldProvideDynamicImplementationFor:sel])
{
[self provideDynamicImplementationToConstructDefinitionForSEL:sel];
return YES;
}

return [super resolveInstanceMethod:sel];
}

Expand All @@ -84,7 +84,7 @@ + (BOOL)shouldProvideDynamicImplementationFor:(SEL)sel;

+ (BOOL)selectorReserved:(SEL)selector
{
return [reservedSelectorsAsStrings containsObject:NSStringFromSelector(selector)];
return [reservedSelectorsAsStrings containsObject:NSStringFromSelector(selector)];
}

+ (void)provideDynamicImplementationToConstructDefinitionForSEL:(SEL)sel;
Expand All @@ -95,51 +95,52 @@ + (void)provideDynamicImplementationToConstructDefinitionForSEL:(SEL)sel;

+ (IMP)implementationToConstructDefinitionForSEL:(SEL)selWithAdvicePrefix
{
return imp_implementationWithBlock((__bridge id) objc_unretainedPointer((TyphoonDefinition *)^(id me)
{
NSString *key = [TyphoonAssemblySelectorAdviser keyForAdvisedSEL:selWithAdvicePrefix];
return [self definitionForKey:key me:me];
}));
return imp_implementationWithBlock((__bridge id) objc_unretainedPointer((TyphoonDefinition*) ^(id me)
{
NSString* key = [TyphoonAssemblySelectorAdviser keyForAdvisedSEL:selWithAdvicePrefix];
return [self definitionForKey:key me:me];
}));
}

+ (TyphoonDefinition *)definitionForKey:(NSString *)key me:(id)me
+ (TyphoonDefinition*)definitionForKey:(NSString*)key me:(id)me
{
LogTrace(@"Resolving request for definition for key: %@", key);

TyphoonDefinition *cached = [self cachedDefinitionForKey:key me:me];
TyphoonDefinition* cached = [self cachedDefinitionForKey:key me:me];
if (!cached)
{
LogTrace(@"Definition for key: '%@' is not cached, building...", key);
return [self buildDefinitionForKey:key me:me];
}

LogTrace(@"Using cached definition for key '%@.'", key);
return cached;
}

+ (TyphoonDefinition *)cachedDefinitionForKey:(NSString *)key me:(id)me
+ (TyphoonDefinition*)cachedDefinitionForKey:(NSString*)key me:(id)me
{
return [[me cachedDefinitionsForMethodName] objectForKey:key];
}

+ (TyphoonDefinition *)buildDefinitionForKey:(NSString *)key me:(TyphoonAssembly *)me;
+ (TyphoonDefinition*)buildDefinitionForKey:(NSString*)key me:(TyphoonAssembly*)me;
{
NSMutableArray *resolveStack = [self resolveStackForKey:key];
NSMutableArray* resolveStack = [self resolveStackForKey:key];
[self markCurrentlyResolvingKey:key resolveStack:resolveStack];

if ([self dependencyForKey:key involvedInCircularDependencyInResolveStack:resolveStack]) {

if ([self dependencyForKey:key involvedInCircularDependencyInResolveStack:resolveStack])
{
return [self definitionToTerminateCircularDependencyForKey:key];
}

id cached = [self populateCacheWithDefinitionForKey:key me:me];
[self markKeyResolved:key resolveStack:resolveStack];

LogTrace(@"Did finish building definition for key: '%@'", key);

return cached;
}

+ (BOOL)dependencyForKey:(NSString *)key involvedInCircularDependencyInResolveStack:(NSArray *)resolveStack;
+ (BOOL)dependencyForKey:(NSString*)key involvedInCircularDependencyInResolveStack:(NSArray*)resolveStack;
{
if ([resolveStack count] >= 2)
{
Expand All @@ -151,67 +152,74 @@ + (BOOL)dependencyForKey:(NSString *)key involvedInCircularDependencyInResolveSt
return YES;
}
}

return NO;
}

+ (TyphoonDefinition *)definitionToTerminateCircularDependencyForKey:(NSString *)key
+ (TyphoonDefinition*)definitionToTerminateCircularDependencyForKey:(NSString*)key
{
// we return a 'dummy' definition just to terminate the cycle. This dummy definition will be overwritten by the real one, which will be set further up the stack and will overwrite this one in 'cachedDefinitionsForMethodName'.
return [[TyphoonDefinition alloc] initWithClass:[NSString class] key:key];
}

+ (NSMutableArray *)resolveStackForKey:(NSString *)key
+ (NSMutableArray*)resolveStackForKey:(NSString*)key
{
NSMutableArray *resolveStack = [resolveStackForKey objectForKey:key];
if (!resolveStack) {
NSMutableArray* resolveStack = [resolveStackForSelector objectForKey:key];
if (!resolveStack)
{
if (!resolveStackForSelector)
{
resolveStackForSelector = [[NSMutableDictionary alloc] init];
}
resolveStack = [[NSMutableArray alloc] init];
[resolveStackForKey setObject:resolveStack forKey:key];
[resolveStackForSelector setObject:resolveStack forKey:key];
}
return resolveStack;
}

+ (void)markCurrentlyResolvingKey:(NSString *)key resolveStack:(NSMutableArray *)resolveStack
+ (void)markCurrentlyResolvingKey:(NSString*)key resolveStack:(NSMutableArray*)resolveStack
{
[resolveStack addObject:key];
}

+ (TyphoonDefinition *)populateCacheWithDefinitionForKey:(NSString *)key me:(TyphoonAssembly *)me;
+ (TyphoonDefinition*)populateCacheWithDefinitionForKey:(NSString*)key me:(TyphoonAssembly*)me;
{
id d = [self definitionByCallingAssemblyMethodForKey:key me:me];
[self populateCacheWithDefinition:d forKey:key me:me];
return d;
}

+ (id)definitionByCallingAssemblyMethodForKey:(NSString *)key me:(TyphoonAssembly *)me
+ (id)definitionByCallingAssemblyMethodForKey:(NSString*)key me:(TyphoonAssembly*)me
{
SEL sel = [TyphoonAssemblySelectorAdviser advisedSELForKey:key];
id cached = objc_msgSend(me, sel); // the advisedSEL will call through to the original, unwrapped implementation because of the active swizzling.
id cached = objc_msgSend(me,
sel); // the advisedSEL will call through to the original, unwrapped implementation because of the active swizzling.
return cached;
}

+ (void)populateCacheWithDefinition:(TyphoonDefinition *)cached forKey:(NSString *)key me:(id)me
+ (void)populateCacheWithDefinition:(TyphoonDefinition*)cached forKey:(NSString*)key me:(id)me
{
if (cached && [cached isKindOfClass:[TyphoonDefinition class]])
{
TyphoonDefinition* definition = (TyphoonDefinition*) cached;
[self setKey:key onDefinitionIfExistingKeyEmpty:definition];

[[me cachedDefinitionsForMethodName] setObject:definition forKey:key];
}
}

+ (void)setKey:(NSString *)key onDefinitionIfExistingKeyEmpty:(TyphoonDefinition *)definition
+ (void)setKey:(NSString*)key onDefinitionIfExistingKeyEmpty:(TyphoonDefinition*)definition
{
if ([definition.key length] == 0)
{
definition.key = key;
}
}

+ (void)markKeyResolved:(NSString *)key resolveStack:(NSMutableArray *)resolveStack
+ (void)markKeyResolved:(NSString*)key resolveStack:(NSMutableArray*)resolveStack
{
if (resolveStack.count) {
if (resolveStack.count)
{
[resolveStack removeAllObjects];
}
}
Expand Down
2 changes: 1 addition & 1 deletion Tests/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ SPEC CHECKSUMS:
OCMockito: 01560fd24319b85c223e10f52e2e41fbe2c6d434
Typhoon: 09b665c2b04ccd4c43293383beadd27b820f674e

COCOAPODS: 0.23.0
COCOAPODS: 0.24.0
2 changes: 1 addition & 1 deletion Tests/Pods/Manifest.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Tests/Pods/Pods-iOS Tests (Cocoapods)-resources.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Tests/Pods/Pods-ios-resources.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Tests/Pods/Pods-osx-resources.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 8241edf

Please sign in to comment.