-
Notifications
You must be signed in to change notification settings - Fork 223
Expand file tree
/
Copy pathJSObjectionInjectorEntry.m
More file actions
93 lines (66 loc) · 2.74 KB
/
JSObjectionInjectorEntry.m
File metadata and controls
93 lines (66 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#import "JSObjectionInjectorEntry.h"
#import "JSObjection.h"
#import "JSObjectionUtils.h"
#import "NSObject+Objection.h"
@interface JSObjectionInjectorEntry() {
JSObjectionScope _lifeCycle;
id _storageCache;
}
- (id)buildObject:(NSArray *)arguments initializer:(SEL)initializer;
- (id)argumentsForObject:(NSArray *)givenArguments;
- (SEL)initializerForObject;
@end
@implementation JSObjectionInjectorEntry
@synthesize lifeCycle = _lifeCycle;
@synthesize classEntry = _classEntry;
#pragma mark - Instance Methods
- (instancetype)initWithClass:(Class)theClass lifeCycle:(JSObjectionScope)theLifeCycle {
if ((self = [super init])) {
_lifeCycle = theLifeCycle;
_classEntry = theClass;
_storageCache = nil;
}
return self;
}
- (instancetype) extractObject:(NSArray *)arguments initializer:(SEL)initializer {
if (self.lifeCycle == JSObjectionScopeNormal || !_storageCache) {
return [self buildObject:arguments initializer: initializer];
}
return _storageCache;
}
- (instancetype)extractObject:(NSArray *)arguments {
return [self extractObject:arguments initializer:nil];
}
- (void)dealloc {
_storageCache = nil;
}
#pragma mark - Private Methods
- (id)buildObject:(NSArray *)arguments initializer: (SEL) initializer {
id objectUnderConstruction = nil;
if(initializer != nil) {
objectUnderConstruction = JSObjectionUtils.buildObjectWithInitializer(self.classEntry, initializer, arguments);
} else if ([self.classEntry respondsToSelector:@selector(objectionInitializer)]) {
objectUnderConstruction = JSObjectionUtils.buildObjectWithInitializer(self.classEntry, [self initializerForObject], [self argumentsForObject:arguments]);
} else {
objectUnderConstruction = [[self.classEntry alloc] init];
}
if (self.lifeCycle == JSObjectionScopeSingleton) {
_storageCache = objectUnderConstruction;
}
JSObjectionUtils.injectDependenciesIntoProperties(self.injector, self.classEntry, objectUnderConstruction);
return objectUnderConstruction;
}
- (SEL)initializerForObject {
return NSSelectorFromString([[self.classEntry objectionInitializer] objectForKey:JSObjectionInitializerKey]);
}
- (NSArray *)argumentsForObject:(NSArray *)givenArguments {
return givenArguments.count > 0 ? givenArguments : [[self.classEntry objectionInitializer] objectForKey:JSObjectionDefaultArgumentsKey];
}
#pragma mark - Class Methods
+ (id)entryWithClass:(Class)theClass scope:(JSObjectionScope)theLifeCycle {
return [[JSObjectionInjectorEntry alloc] initWithClass:theClass lifeCycle:theLifeCycle];
}
+ (id)entryWithEntry:(JSObjectionInjectorEntry *)entry {
return [[JSObjectionInjectorEntry alloc] initWithClass:entry.classEntry lifeCycle:entry.lifeCycle];
}
@end