diff --git a/ChangeLog b/ChangeLog index 0d02cefcb..2e024bfdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-01-08 Quentin Mathe + + * Source/NSValueTransformer (+valueTransformerForName:): Fixed to + automatically register any available NSValueTransformer subclass that + matches the given name and is not yet registered. This behavior is + described in the Cocoa API documentation. + 2014-01-08 Richard Frith-Macdonald * Source/NSUUID.m: diff --git a/Headers/Foundation/NSValueTransformer.h b/Headers/Foundation/NSValueTransformer.h index a94590a0e..76ad8b282 100644 --- a/Headers/Foundation/NSValueTransformer.h +++ b/Headers/Foundation/NSValueTransformer.h @@ -85,6 +85,10 @@ GS_EXPORT NSString* const NSUnarchiveFromDataTransformerName; /** * Returns the transformer registered for the specified name, or nil * if no transformer is registered for name. + * + * If no transformer is found, but the name corresponds to a valid + * NSValueTransformer subclass name, the receiver instantiates this subclass + * using -init and registers it automatically for name. */ + (NSValueTransformer *) valueTransformerForName: (NSString *)name; diff --git a/Source/NSValueTransformer.m b/Source/NSValueTransformer.m index 9eda4715b..2565d0caf 100644 --- a/Source/NSValueTransformer.m +++ b/Source/NSValueTransformer.m @@ -102,6 +102,20 @@ static GSLazyLock *lock = nil; [lock lock]; transformer = [registry objectForKey: name]; IF_NO_GC([transformer retain];) + + if (transformer == nil) + { + Class transformerClass = NSClassFromString(name); + + if (transformerClass != Nil + && [transformerClass isSubclassOfClass: [NSValueTransformer class]]) + { + transformer = [[transformerClass alloc] init]; + + [registry setObject: transformer forKey: name]; + } + } + [lock unlock]; return AUTORELEASE(transformer); }