From b872a58e110c1d83005a54018facb34296f274c0 Mon Sep 17 00:00:00 2001 From: Justin DeWind Date: Mon, 11 Jun 2012 10:31:05 -0500 Subject: [PATCH] Refactored entries to support arguments being passed in --- Source/JSObjectionBindingEntry.m | 2 +- Source/JSObjectionEntry.h | 2 +- Source/JSObjectionEntry.m | 2 +- Source/JSObjectionInjector.m | 7 ++++++- Source/JSObjectionInjectorEntry.m | 8 +++----- Source/JSObjectionProviderEntry.m | 2 +- Source/JSObjectionUtils.h | 4 ++++ Source/JSObjectionUtils.m | 21 +++++++++++++++++++-- 8 files changed, 36 insertions(+), 12 deletions(-) diff --git a/Source/JSObjectionBindingEntry.m b/Source/JSObjectionBindingEntry.m index ae2bc76..d804c1a 100644 --- a/Source/JSObjectionBindingEntry.m +++ b/Source/JSObjectionBindingEntry.m @@ -10,7 +10,7 @@ - (id)initWithObject:(id)theObject { return self; } -- (id)extractObject { +- (id)extractObject:(NSArray *)arguments { return _instance; } diff --git a/Source/JSObjectionEntry.h b/Source/JSObjectionEntry.h index 263a7f6..1d608a5 100644 --- a/Source/JSObjectionEntry.h +++ b/Source/JSObjectionEntry.h @@ -12,7 +12,7 @@ typedef enum { @protocol JSObjectionEntry @property (nonatomic, readonly) JSObjectionInstantiationRule lifeCycle; @property (nonatomic, assign) JSObjectionInjector *injector; -- (id)extractObject; +- (id)extractObject:(NSArray *)arguments; + (id)entryWithEntry:(JSObjectionEntry *)entry; @end diff --git a/Source/JSObjectionEntry.m b/Source/JSObjectionEntry.m index 9f37b2e..e8ae568 100644 --- a/Source/JSObjectionEntry.m +++ b/Source/JSObjectionEntry.m @@ -4,7 +4,7 @@ @implementation JSObjectionEntry @synthesize injector = _injector; @dynamic lifeCycle; -- (id)extractObject { +- (id)extractObject:(NSArray *)arguments { return nil; } diff --git a/Source/JSObjectionInjector.m b/Source/JSObjectionInjector.m index 255abe4..7d35986 100644 --- a/Source/JSObjectionInjector.m +++ b/Source/JSObjectionInjector.m @@ -1,6 +1,7 @@ #import "JSObjectionInjector.h" #import "JSObjectionEntry.h" #import "JSObjectFactory.h" +#import "JSObjectionUtils.h" #import #import @@ -95,7 +96,11 @@ - (id)getObject:(id)classOrProtocol, ... { } if (classOrProtocol && injectorEntry) { - return [injectorEntry extractObject]; + va_list va_arguments; + va_start(va_arguments, classOrProtocol); + NSArray *arguments = JSObjectionUtils.transformVariadicArgsToArray(va_arguments); + va_end(va_arguments); + return [injectorEntry extractObject:arguments]; } return nil; diff --git a/Source/JSObjectionInjectorEntry.m b/Source/JSObjectionInjectorEntry.m index 6b109db..6fa1633 100644 --- a/Source/JSObjectionInjectorEntry.m +++ b/Source/JSObjectionInjectorEntry.m @@ -26,8 +26,7 @@ - (id)initWithClass:(Class)theClass lifeCycle:(JSObjectionInstantiationRule)theL return self; } -- (id)extractObject -{ +- (id)extractObject:(NSArray *)arguments { if (self.lifeCycle == JSObjectionInstantiationRuleNormal || !_storageCache) { return [self buildObject]; } @@ -45,8 +44,7 @@ - (void)dealloc #pragma mark - #pragma mark Private Methods -- (void)notifyObjectThatItIsReady: (id) object -{ +- (void)notifyObjectThatItIsReady:(id)object { if([object respondsToSelector:@selector(awakeFromObjection)]) { [object performSelector:@selector(awakeFromObjection)]; } @@ -55,7 +53,7 @@ - (void)notifyObjectThatItIsReady: (id) object - (id)buildObject { id objectUnderConstruction = [[[self.classEntry alloc] init] autorelease]; - if (self.lifeCycle != JSObjectionInstantiationRuleNormal) { + if (self.lifeCycle == JSObjectionInstantiationRuleSingleton) { _storageCache = [objectUnderConstruction retain]; } diff --git a/Source/JSObjectionProviderEntry.m b/Source/JSObjectionProviderEntry.m index 97d4fa5..7b9f90d 100644 --- a/Source/JSObjectionProviderEntry.m +++ b/Source/JSObjectionProviderEntry.m @@ -19,7 +19,7 @@ - (id)initWithBlock:(id(^)(JSObjectionInjector *context))theBlock { return self; } -- (id)extractObject { +- (id)extractObject:(NSArray *)arguments { if (_block) { return _block(self.injector); } diff --git a/Source/JSObjectionUtils.h b/Source/JSObjectionUtils.h index 41cfd9d..82f0555 100644 --- a/Source/JSObjectionUtils.h +++ b/Source/JSObjectionUtils.h @@ -1,6 +1,9 @@ #import #import +NSString *const JSObjectionInitializerKey; +NSString *const JSObjectionDefaultArgumentsKey; + typedef enum { JSObjectionTypeClass, JSObjectionTypeProtocol @@ -16,4 +19,5 @@ extern const struct JSObjectionUtils { objc_property_t (*propertyForClass)(Class klass, NSString *propertyName); NSSet* (*buildDependenciesForClass)(Class klass, NSSet *requirements); NSDictionary* (*buildInitializer)(SEL selector, NSArray *arguments); + NSArray* (*transformVariadicArgsToArray)(va_list va_arguments); } JSObjectionUtils; \ No newline at end of file diff --git a/Source/JSObjectionUtils.m b/Source/JSObjectionUtils.m index 680be8a..36e02ba 100644 --- a/Source/JSObjectionUtils.m +++ b/Source/JSObjectionUtils.m @@ -3,6 +3,9 @@ static NSString *const JSObjectionException = @"JSObjectionException"; +NSString *const JSObjectionInitializerKey = @"initializer"; +NSString *const JSObjectionDefaultArgumentsKey = @"arguments"; + static JSObjectionPropertyInfo FindClassOrProtocolForProperty(objc_property_t property) { NSString *attributes = [NSString stringWithCString: property_getAttributes(property) encoding: NSASCIIStringEncoding]; NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSASCIIStringEncoding]; @@ -53,7 +56,20 @@ static JSObjectionPropertyInfo FindClassOrProtocolForProperty(objc_property_t pr } static NSDictionary* BuildInitializer(SEL selector, NSArray *defaultArguments) { - return nil; + return [NSDictionary dictionaryWithObjectsAndKeys: + NSStringFromSelector(selector), JSObjectionInitializerKey, + defaultArguments, JSObjectionDefaultArgumentsKey + , nil]; +} + +static NSArray* TransformVariadicArgsToArray(va_list va_arguments) { + NSMutableArray *arguments = [NSMutableArray array]; + id object; + while ((object = va_arg( va_arguments, id ))) { + [arguments addObject:object]; + } + + return [[arguments copy] autorelease]; } static objc_property_t GetProperty(Class klass, NSString *propertyName) { @@ -68,5 +84,6 @@ static objc_property_t GetProperty(Class klass, NSString *propertyName) { .findClassOrProtocolForProperty = FindClassOrProtocolForProperty, .propertyForClass = GetProperty, .buildDependenciesForClass = BuildDependenciesForClass, - .buildInitializer = BuildInitializer + .buildInitializer = BuildInitializer, + .transformVariadicArgsToArray = TransformVariadicArgsToArray };