1// Copyright 2015-present 650 Industries. All rights reserved.
2
3#import "EXScopedModuleRegistry.h"
4#import "EXUnversioned.h"
5
6static NSMutableDictionary<NSString *, NSDictionary *> *EXScopedModuleClasses;
7
8NSDictionary<NSString *, NSDictionary *> * EXGetScopedModuleClasses(void);
9NSDictionary<NSString *, NSDictionary *> * EXGetScopedModuleClasses()
10{
11  return EXScopedModuleClasses;
12}
13
14void EXRegisterScopedModule(Class, ...);
15void EXRegisterScopedModule(Class moduleClass, ...)
16{
17  static dispatch_once_t onceToken;
18  dispatch_once(&onceToken, ^{
19    EXScopedModuleClasses = [NSMutableDictionary dictionary];
20  });
21
22  NSString *kernelServiceClassName;
23  va_list argumentList;
24  NSMutableDictionary *unversionedKernelServiceClassNames = [[NSMutableDictionary alloc] init];
25
26  va_start(argumentList, moduleClass);
27  while ((kernelServiceClassName = va_arg(argumentList, NSString*))) {
28    if ([kernelServiceClassName isEqualToString:@"nil"]) {
29      unversionedKernelServiceClassNames[kernelServiceClassName] = EX_KERNEL_SERVICE_NONE;
30    } else {
31      unversionedKernelServiceClassNames[kernelServiceClassName] = [EX_UNVERSIONED(@"EX") stringByAppendingString:kernelServiceClassName];
32    }
33  }
34  va_end(argumentList);
35
36  NSString *moduleClassName = NSStringFromClass(moduleClass);
37  if (moduleClassName) {
38    EXScopedModuleClasses[moduleClassName] = unversionedKernelServiceClassNames;
39  }
40}
41
42@implementation EXScopedModuleRegistry
43
44RCT_EXPORT_MODULE(ExponentScopedModuleRegistry);
45
46@synthesize bridge = _bridge;
47
48- (void)setBridge:(RCTBridge *)bridge
49{
50  _bridge = bridge;
51}
52
53@end
54
55@implementation RCTBridge (EXScopedModuleRegistry)
56
57- (EXScopedModuleRegistry *)scopedModules
58{
59  return [self moduleForClass:[EXScopedModuleRegistry class]];
60}
61
62@end
63