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