1// Copyright 2018-present 650 Industries. All rights reserved.
2
3#import <UMAppLoader/UMAppLoaderProvider.h>
4#import <UMAppLoader/UMAppLoaderInterface.h>
5
6static NSMutableDictionary<NSString *, Class> *UMProvidedAppLoaderClasses;
7
8extern void UMRegisterAppLoader(NSString *, Class);
9extern void UMRegisterAppLoader(NSString *loaderName, Class loaderClass)
10{
11  if ([loaderClass conformsToProtocol:@protocol(UMAppLoaderInterface)]) {
12    if (!UMProvidedAppLoaderClasses) {
13      UMProvidedAppLoaderClasses = [NSMutableDictionary new];
14    }
15    UMProvidedAppLoaderClasses[loaderName] = loaderClass;
16  } else {
17    NSLog(@"UMAppLoader class (%@) doesn't conform to the UMAppLoaderInterface protocol.", NSStringFromClass(loaderClass));
18  }
19}
20
21@implementation UMAppLoaderProvider
22
23- (nullable id<UMAppLoaderInterface>)createAppLoader:(NSString *)loaderName
24{
25  Class loaderClass = UMProvidedAppLoaderClasses[loaderName];
26  return [loaderClass new];
27}
28
29# pragma mark - static
30
31+ (nonnull instancetype)sharedInstance
32{
33  static UMAppLoaderProvider *loaderProvider;
34  static dispatch_once_t once;
35
36  dispatch_once(&once, ^{
37    loaderProvider = [[UMAppLoaderProvider alloc] init];
38  });
39  return loaderProvider;
40}
41
42@end
43