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