// Protocol Buffers for Objective C
//
// Copyright 2010 Booyah Inc.
// Copyright 2008 Cyrus Najmabadi
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import "ExtensionRegistry.h"

@interface PBExtensionRegistry()
@property (strong) NSDictionary* classMap;
@end

@implementation PBExtensionRegistry

@synthesize classMap;


static PBExtensionRegistry* emptyRegistry = nil;

+ (void) initialize {
  if (self == [PBExtensionRegistry class]) {
    emptyRegistry = [[PBExtensionRegistry alloc] initWithClassMap:[NSDictionary dictionary]];
  }
}


- (id) initWithClassMap:(NSDictionary*) map_{
  if ((self = [super init])) {
    self.classMap = map_;
  }

  return self;
}


- (id) keyForClass:(Class) clazz {
  return NSStringFromClass(clazz);
}


+ (PBExtensionRegistry*) emptyRegistry {
  return emptyRegistry;
}


- (id<PBExtensionField>) getExtension:(Class) clazz fieldNumber:(SInt32) fieldNumber {
  NSDictionary* extensionMap = [classMap objectForKey:[self keyForClass:clazz]];
  return [extensionMap objectForKey:[NSNumber numberWithInteger:fieldNumber]];
}

@end
