From 74210c8f6ac0faf7db8cbadc984c6bd9ee4efc69 Mon Sep 17 00:00:00 2001 From: qmathe Date: Thu, 9 Jan 2014 10:21:55 +0000 Subject: [PATCH] Fixed +[NSValueTransformer valueTransformerForName:] 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. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@37565 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 7 +++++++ Headers/Foundation/NSValueTransformer.h | 4 ++++ Source/NSValueTransformer.m | 14 ++++++++++++++ 3 files changed, 25 insertions(+) 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); }