| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | 
							- 
 - #import "RNNOptions.h"
 - #import <objc/runtime.h>
 - 
 - @implementation RNNOptions
 - 
 - -(instancetype)	initWithDict:(NSDictionary *)dict {
 - 	self = [super init];
 - 	[self initializeOptionsPropertiesWithDict:dict];
 - 	
 - 	[self mergeWith:dict];
 - 	return self;
 - }
 - 
 - - (void)applyOn:(UIViewController *)viewController defaultOptions:(RNNOptions *)defaultOptions {
 - 	[defaultOptions applyOn:viewController];
 - 	[self applyOn:viewController];
 - }
 - 
 - -(void)mergeWith:(NSDictionary *)otherOptions {
 - 	for (id key in otherOptions) {
 - 		if ([self hasProperty:key]) {
 - 			if ([[self valueForKey:key] isKindOfClass:[RNNOptions class]]) {
 - 				RNNOptions* options = [self valueForKey:key];
 - 				[options mergeWith:[otherOptions objectForKey:key]];
 - 			} else {
 - 				[self setValue:[otherOptions objectForKey:key] forKey:key];
 - 			}
 - 		}
 - 	}
 - }
 - 
 - -(void)mergeIfEmptyWith:(NSDictionary *)otherOptions {
 - 	for (id key in otherOptions) {
 - 		if ([self hasProperty:key]) {
 - 			if ([[self valueForKey:key] isKindOfClass:[RNNOptions class]]) {
 - 				RNNOptions* options = [self valueForKey:key];
 - 				[options mergeIfEmptyWith:[otherOptions objectForKey:key]];
 - 			} else if (![self valueForKey:key]) {
 - 				[self setValue:[otherOptions objectForKey:key] forKey:key];
 - 			}
 - 		}
 - 	}
 - }
 - 
 - - (BOOL)hasProperty:(NSString*)propName {
 - 	return [self respondsToSelector:NSSelectorFromString(propName)];
 - }
 - 
 - - (void)initializeOptionsPropertiesWithDict:(NSDictionary*)dict {
 - 	unsigned int count;
 - 	objc_property_t* props = class_copyPropertyList([self class], &count);
 - 	for (int i = 0; i < count; i++) {
 - 		objc_property_t property = props[i];
 - 		NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
 - 		const char * type = property_getAttributes(property);
 - 		NSString * typeString = [NSString stringWithUTF8String:type];
 - 		NSArray * attributes = [typeString componentsSeparatedByString:@","];
 - 		NSString * typeAttribute = [attributes objectAtIndex:0];
 - 		
 - 		if ([typeAttribute hasPrefix:@"T@"] && [typeAttribute length] > 3) {
 - 			NSString * typeClassName = [typeAttribute substringWithRange:NSMakeRange(3, [typeAttribute length]-4)];
 - 			Class typeClass = NSClassFromString(typeClassName);
 - 			if ([typeClass isSubclassOfClass:[RNNOptions class]]) {
 - 				RNNOptions* value = [[typeClass alloc] initWithDict:dict[propertyName]];
 - 				[self setValue:value forKey:propertyName];
 - 			}
 - 		}
 - 		
 - 	}
 - 	free(props);
 - }
 - 
 - @end
 
 
  |