You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: ZIKRouteRegistry.m
    path of file: ./repos/ZIKRouter/ZIKRouter/Router/Registry
    
    the code of the file until where you have to start completion: //
//  ZIKRouteRegistry.m
//  ZIKRouter
//
//  Created by zuik on 2017/11/15.
//  Copyright Â© 2017 zuik. All rights reserved.
//
//  This source code is licensed under the MIT-style license found in the
//  LICENSE file in the root directory of this source tree.
//

#import "ZIKRouteRegistry.h"
#import "ZIKRouteRegistryInternal.h"
#import "ZIKRouterInternal.h"
#import "ZIKClassCapabilities.h"
#if ZIK_HAS_UIKIT
#import <UIKit/UIKit.h>
#else
#import <AppKit/AppKit.h>
#endif
#import <objc/runtime.h>
#import "ZIKRouterRuntime.h"
#import "ZIKRouter.h"
#import "ZIKRoute.h"
#import "ZIKRouterType.h"
#import "ZIKImageSymbol.h"
#import "NSString+Demangle.h"

static NSMutableSet<Class> *_registries;
static BOOL _autoRegister = YES;
static BOOL _registrationFinished = NO;
static CFMutableSetRef _factoryBlocks;

@interface ZIKRouteRegistry()
@property (nonatomic, class, readonly) NSMutableSet *registries;
@property (nonatomic, class) BOOL registrationFinished;
@end

/// Implementation is in ZRouter
@interface ZIKRouteRegistry(SwiftAdapter)
+ (id)_swiftRouteForDestinationAdapter:(Protocol *)destinationProtocol;
+ (id)_swiftRouteForModuleAdapter:(Protocol *)moduleProtocol;
@end

@implementation ZIKRouteRegistry

#pragma mark Auto Register

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _factoryBlocks = CFSetCreateMutable(kCFAllocatorDefault, 0, NULL);
    
function {
    NSParameterAssert(function);
    NSAssert([destinationClass conformsToProtocol:destinationProtocol], @"destination class (%@) should conforms to registering protocol (%@)", NSStringFromClass(destinationClass), NSStringFromProtocol(destinationProtocol));
    NSAssert([self isDestinationClassRoutable:destinationClass], @"destination class (%@) should conforms to ZIKRoutableView or ZIKRoutableService.", NSStringFromClass(destinationClass));
    NSAssert3(!CFDictionaryGetValue(self.destinationProtocolToDestinationMap, (__bridge const void *)destinationProtocol), @"Protocol (%@) already registered with another destination (%@), can't be registered with destination (%@).", NSStringFromProtocol(destinationProtocol), NSStringFromClass((Class)CFDictionaryGetValue(self.destinationProtocolToDestinationMap, (__bridge const void *)destinationProtocol)), NSStringFromClass(destinationClass));
    NSAssert3(!self.destinationToExclusiveRouterMap ||
              (self.destinationToExclusiveRouterMap && !CFDictionaryGetValue(self.destinationToExclusiveRouterMap, (__bridge const void *)(destinationClass))), @"There is a registered exclusive router (%@), can't register destination protocol (%@) for this destinationClass (%@).",CFDictionaryGetValue(self.destinationToExclusiveRouterMap, (__bridge const void *)(destinationClass)), NSStringFromProtocol(destinationProtocol), destinationClass);
#if DEBUG
    NSAssert3(!CFDictionaryGetValue(self.destinationProtocolToFactoryMap, (__bridge const void *)destinationProtocol), @"Protocol (%@) already registered with a factory or block (%p), can't be registered with function (%@).", NSStringFromProtocol(destinationProtocol), CFDictionaryGetValue(self.destinationProtocolToFactoryMap, (__bridge const void *)destinationProtocol), [ZIKImageSymbol symbolNameForAddress:function]);
#endif
    CFDictionaryAddValue(self.destinationProtocolToFactoryMap, (__bridge const void *)destinationProtocol, (void *)function);
    CFDictionaryAddValue(self.destinationToDefaultFactoryMap, (__bridge const void *)destinationClass, (void *)function);
    CFDictionaryAddValue(self.destinationProtocolToDestinationMap, (__bridge const void *)destinationProtocol, (__bridge const void *)destinationClass);
}

+ (void)registerModuleProtocol:(Protocol *)configProtocol forMakingDestination:(Class)destinationClass factoryFunction:(ZIKPerformRouteConfiguration<ZIKConfigurationMakeable> *_Nonnull(* _Nonnull)(void))function {
    NSParameterAssert(function);
#if DEBUG
    ZIKPerformRouteConfiguration<ZIKConfigurationMakeable> *config = function();
    NSAssert([config conformsToProtocol:configProtocol], @"configuration class (%@) should conforms to registering protocol (%@)", NSStringFromClass([config class]), NSStringFromProtocol(configProtocol));
    [self validateMakeableConfiguration:config];
#end