mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-30 20:34:04 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| //
 | |
| //  FLEXProtocolBuilder.m
 | |
| //  FLEX
 | |
| //
 | |
| //  Derived from MirrorKit.
 | |
| //  Created by Tanner on 7/4/15.
 | |
| //  Copyright (c) 2020 FLEX Team. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "FLEXProtocolBuilder.h"
 | |
| #import "FLEXProtocol.h"
 | |
| #import "FLEXProperty.h"
 | |
| #import <objc/runtime.h>
 | |
| 
 | |
| #define MutationAssertion(msg) if (self.isRegistered) { \
 | |
|     [NSException \
 | |
|         raise:NSInternalInconsistencyException \
 | |
|         format:msg \
 | |
|     ]; \
 | |
| }
 | |
| 
 | |
| @interface FLEXProtocolBuilder ()
 | |
| @property (nonatomic) Protocol *workingProtocol;
 | |
| @property (nonatomic) NSString *name;
 | |
| @end
 | |
| 
 | |
| @implementation FLEXProtocolBuilder
 | |
| 
 | |
| - (id)init {
 | |
|     [NSException
 | |
|         raise:NSInternalInconsistencyException
 | |
|         format:@"Class instance should not be created with -init"
 | |
|     ];
 | |
|     return nil;
 | |
| }
 | |
| 
 | |
| #pragma mark Initializers
 | |
| + (instancetype)allocateProtocol:(NSString *)name {
 | |
|     NSParameterAssert(name);
 | |
|     return [[self alloc] initWithProtocol:objc_allocateProtocol(name.UTF8String)];
 | |
|     
 | |
| }
 | |
| 
 | |
| - (id)initWithProtocol:(Protocol *)protocol {
 | |
|     NSParameterAssert(protocol);
 | |
|     
 | |
|     self = [super init];
 | |
|     if (self) {
 | |
|         _workingProtocol = protocol;
 | |
|         _name = NSStringFromProtocol(self.workingProtocol);
 | |
|     }
 | |
|     
 | |
|     return self;
 | |
| }
 | |
| 
 | |
| - (NSString *)description {
 | |
|     return [NSString stringWithFormat:@"<%@ name=%@, registered=%d>",
 | |
|             NSStringFromClass(self.class), self.name, self.isRegistered];
 | |
| }
 | |
| 
 | |
| #pragma mark Building
 | |
| 
 | |
| - (void)addProperty:(FLEXProperty *)property isRequired:(BOOL)isRequired {
 | |
|     MutationAssertion(@"Properties cannot be added once a protocol has been registered");
 | |
| 
 | |
|     unsigned int count;
 | |
|     objc_property_attribute_t *attributes = [property copyAttributesList:&count];
 | |
|     protocol_addProperty(self.workingProtocol, property.name.UTF8String, attributes, count, isRequired, YES);
 | |
|     free(attributes);
 | |
| }
 | |
| 
 | |
| - (void)addMethod:(SEL)selector
 | |
|     typeEncoding:(NSString *)typeEncoding
 | |
|        isRequired:(BOOL)isRequired
 | |
|  isInstanceMethod:(BOOL)isInstanceMethod {
 | |
|     MutationAssertion(@"Methods cannot be added once a protocol has been registered");
 | |
|     protocol_addMethodDescription(self.workingProtocol, selector, typeEncoding.UTF8String, isRequired, isInstanceMethod);
 | |
| }
 | |
| 
 | |
| - (void)addProtocol:(Protocol *)protocol {
 | |
|     MutationAssertion(@"Protocols cannot be added once a protocol has been registered");
 | |
|     protocol_addProtocol(self.workingProtocol, protocol);
 | |
| }
 | |
| 
 | |
| - (FLEXProtocol *)registerProtocol {
 | |
|     MutationAssertion(@"Protocol is already registered");
 | |
|     
 | |
|     _isRegistered = YES;
 | |
|     objc_registerProtocol(self.workingProtocol);
 | |
|     return [FLEXProtocol protocol:self.workingProtocol];
 | |
| }
 | |
| 
 | |
| @end
 | 
