1 // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 #import <React/RCTBridge.h>
4 #import <React/RCTBridgeModule.h>
5 
6 #import "EXScopedBridgeModule.h"
7 
8 /**
9  *  Use this in place of RCT_EXPORT_MODULE() to auto-init an instance of your scoped module on RCTBridge instances.
10  *  @param js_name same as RCT_EXPORT_MODULE(), the module name available in JS
11  *  @param kernel_service_class if specified, your module will be passed an unversioned instance of this kernel service at runtime.
12  *         e.g. MyKernelService -> an instance of EXMyKernelService
13  */
14 #define EX_EXPORT_SCOPED_MODULE(js_name, kernel_service_class) \
15 RCT_EXTERN void EXRegisterScopedModule(Class, NSString *); \
16 + (NSString *)moduleName { return @#js_name; } \
17 + (void)load { EXRegisterScopedModule(self, @#kernel_service_class); }
18 
19 /**
20  *  Provides a namespace/bottleneck through which scoped modules
21  *  can make themselves accessible to other modules.
22  *
23  *  e.g. EX_DECLARE_SCOPED_MODULE_GETTER(EXCoolClass, coolClass)
24  *  provides the getter `_bridge.scopedModules.coolClass`.
25  */
26 #define EX_DECLARE_SCOPED_MODULE_GETTER(className, getter) \
27 @interface EXScopedModuleRegistry (className) \
28 @property (nonatomic, readonly) className *getter; \
29 @end\
30 
31 /**
32  *  Use in conjunction with EX_DECLARE_SCOPED_MODULE_GETTER, but in the corresponding implementation file.
33  */
34 #define EX_DEFINE_SCOPED_MODULE_GETTER(className, getter) \
35 @implementation  EXScopedModuleRegistry (className) \
36 - (className *)getter { return [self.bridge moduleForClass:[className class]]; } \
37 @end\
38 
39 @interface EXScopedModuleRegistry : NSObject <RCTBridgeModule>
40 
41 @end
42 
43 @interface RCTBridge (EXScopedModuleRegistry)
44 
45 @property (nonatomic, readonly) EXScopedModuleRegistry *scopedModules;
46 
47 @end
48