diff --git a/Code/ObjectMapping/RKObjectMappingProvider.m b/Code/ObjectMapping/RKObjectMappingProvider.m index e5f2ca26..27792b19 100644 --- a/Code/ObjectMapping/RKObjectMappingProvider.m +++ b/Code/ObjectMapping/RKObjectMappingProvider.m @@ -66,12 +66,14 @@ - (NSArray*)objectMappingsForClass:(Class)theClass { NSMutableArray* mappings = [NSMutableArray array]; NSArray* mappingsToSearch = [[NSArray arrayWithArray:_objectMappings] arrayByAddingObjectsFromArray:[_mappingsByKeyPath allValues]]; - for (RKObjectMapping* objectMapping in mappingsToSearch) { - if (objectMapping.objectClass == theClass && ![mappings containsObject:objectMapping]) { - [mappings addObject:objectMapping]; + for (NSObject *candidateMapping in mappingsToSearch) { + if (![candidateMapping respondsToSelector:@selector(objectClass)] || [mappings containsObject:candidateMapping]) + continue; + Class mappedClass = [candidateMapping performSelector:@selector(objectClass)]; + if (mappedClass == theClass) { + [mappings addObject:candidateMapping]; } } - return [NSArray arrayWithArray:mappings]; } diff --git a/Specs/ObjectMapping/RKObjectMappingNextGenSpec.m b/Specs/ObjectMapping/RKObjectMappingNextGenSpec.m index b74e7de0..7f7ddc11 100644 --- a/Specs/ObjectMapping/RKObjectMappingNextGenSpec.m +++ b/Specs/ObjectMapping/RKObjectMappingNextGenSpec.m @@ -1509,6 +1509,32 @@ assertThat([mappingProvider objectMappingsForClass:[RKExampleUser class]], is(equalTo([NSArray arrayWithObjects:firstMapping, secondMapping, thirdMapping, nil]))); } +- (void)itShouldReturnAllMappingsForAClassAndNotExplodeWithRegisteredDynamicMappings { + RKObjectMappingProvider* provider = [[RKObjectMappingProvider new] autorelease]; + RKObjectMapping* boyMapping = [RKObjectMapping mappingForClass:[Boy class]]; + [boyMapping mapAttributes:@"name", nil]; + RKObjectMapping* girlMapping = [RKObjectMapping mappingForClass:[Girl class]]; + [girlMapping mapAttributes:@"name", nil]; + RKObjectDynamicMapping* dynamicMapping = [RKObjectDynamicMapping dynamicMapping]; + [dynamicMapping setObjectMapping:boyMapping whenValueOfKeyPath:@"type" isEqualTo:@"Boy"]; + [dynamicMapping setObjectMapping:girlMapping whenValueOfKeyPath:@"type" isEqualTo:@"Girl"]; + [provider setMapping:dynamicMapping forKeyPath:@"dynamic"]; + RKObjectMapping* firstMapping = [RKObjectMapping mappingForClass:[RKExampleUser class]]; + RKObjectMapping* secondMapping = [RKObjectMapping mappingForClass:[RKExampleUser class]]; + [provider addObjectMapping:firstMapping]; + [provider setMapping:secondMapping forKeyPath:@"second"]; + NSException* exception = nil; + NSArray *actualMappings = nil; + @try { + actualMappings = [provider objectMappingsForClass:[RKExampleUser class]]; + } + @catch (NSException * e) { + exception = e; + } + [expectThat(exception) should:be(nil)]; + assertThat(actualMappings, is(equalTo([NSArray arrayWithObjects:firstMapping, secondMapping, nil]))); +} + #pragma mark - RKObjectDynamicMapping - (void)itShouldMapASingleObjectDynamically {