diff dstep/foundation/NSString.d @ 16:19885b43130e

Huge update, the bridge actually works now
author Jacob Carlborg <doob@me.com>
date Sun, 03 Jan 2010 22:06:11 +0100
parents 89f3c3ef1fd2
children b9de51448c6b
line wrap: on
line diff
--- a/dstep/foundation/NSString.d	Mon Aug 03 15:31:48 2009 +0200
+++ b/dstep/foundation/NSString.d	Sun Jan 03 22:06:11 2010 +0100
@@ -8,27 +8,51 @@
 
 import dstep.foundation.NSArray;
 import dstep.foundation.NSCharacterSet;
+import dstep.foundation.NSCoder;
 import dstep.foundation.NSData;
 import dstep.foundation.NSDictionary;
 import dstep.foundation.NSError;
 import dstep.foundation.NSLocale;
+import dstep.foundation.NSObjCRuntime;
 import dstep.foundation.NSObject;
+import dstep.foundation.NSPathUtilities;
 import dstep.foundation.NSRange;
 import dstep.foundation.NSURL;
-import dstep.limits;
+import dstep.foundation.NSZone;
+import dstep.internal.String;
+import dstep.internal.Version;
+import dstep.objc.bridge.Wrapper;
 import dstep.objc.bridge.Bridge;
-import dstep.objc.objc : id;
-import dstep.stdarg;
+import dstep.objc.objc;
 
 import bindings = dstep.foundation.NSString_bindings;
 
-alias ushort unichar;
+alias wchar unichar;
 alias NSUInteger NSStringCompareOptions;
 alias NSUInteger NSStringEncoding;
 alias NSUInteger NSStringEncodingConversionOptions;
 
-const NSString NSParseErrorException;
-const NSString NSCharacterConversionException;
+private
+{
+	NSString NSParseErrorException_;
+	NSString NSCharacterConversionException_;
+}
+
+NSString NSParseErrorException ()
+{
+	if (NSParseErrorException_)
+		return NSParseErrorException_;
+		
+	return NSParseErrorException_ = new NSString(bindings.NSParseErrorException);
+}
+
+NSString NSCharacterConversionException ()
+{
+	if (NSCharacterConversionException_)
+		return NSCharacterConversionException_;
+		
+	return NSCharacterConversionException_ = new NSString(bindings.NSCharacterConversionException);
+}
 
 enum
 {
@@ -75,76 +99,8 @@
 	NSStringEncodingConversionExternalRepresentation = 2
 }
 
-static this ()
-{
-	NSParseErrorException = new NSString(bindings.NSParseErrorException);
-	NSCharacterConversionException = new NSString(bindings.NSCharacterConversionException);
-}
-
-class NSMutableString : NSString
-{
-	mixin ObjcWrap;
-	mixin TNSMutableStringExtensionMethods;
-
-	void replaceCharactersInRange (NSRange range, NSString aString)
-	{
-		return invokeObjcSelf!(void, "replaceCharactersInRange:withString:", NSRange, NSString)(range, aString);
-	}
-}
-
-class NSString : NSObject, INSCopying, INSMutableCopying, INSCoding
-{
-	mixin ObjcWrap;
-	mixin TNSExtendedStringPropertyListParsing;
-	mixin TNSStringExtensionMethods;
-	mixin TNSStringPathExtensions;
-	mixin TNSURLUtilities;
-	mixin TNSStringDeprecated;
-
-	NSUInteger length ()
-	{
-		return invokeObjcSelf!(NSUInteger, "length");
-	}
+const TNSExtendedStringPropertyListParsing = `
 
-	ushort characterAtIndex (NSUInteger index)
-	{
-		return invokeObjcSelf!(ushort, "characterAtIndex:", NSUInteger)(index);
-	}
-
-	Object copyWithZone (NSZone* zone)
-	{
-		return invokeObjcSelf!(Object, "copyWithZone:", NSZone*)(zone);
-	}
-
-	Object mutableCopyWithZone (NSZone* zone)
-	{
-		return invokeObjcSelf!(Object, "mutableCopyWithZone:", NSZone*)(zone);
-	}
-
-	void encodeWithCoder (NSCoder aCoder)
-	{
-		return invokeObjcSelf!(void, "encodeWithCoder:", NSCoder)(aCoder);
-	}
-
-	Object initWithCoder (NSCoder aDecoder)
-	{
-		return invokeObjcSelf!(Object, "initWithCoder:", NSCoder)(aDecoder);
-	}
-
-	this (NSCoder aDecoder)
-	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCoder:", NSCoder)(objcObject, aDecoder);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-}
-
-template TNSExtendedStringPropertyListParsing ()
-{
 	Object propertyList ()
 	{
 		return invokeObjcSelf!(Object, "propertyList");
@@ -154,10 +110,10 @@
 	{
 		return invokeObjcSelf!(NSDictionary, "propertyListFromStringsFileFormat");
 	}
-}
+`;
 
-template TNSMutableStringExtensionMethods ()
-{
+const TNSMutableStringExtensionMethods = `
+
 	void insertString (NSString aString, NSUInteger loc)
 	{
 		return invokeObjcSelf!(void, "insertString:atIndex:", NSString, NSUInteger)(aString, loc);
@@ -183,35 +139,29 @@
 		return invokeObjcSelf!(void, "setString:", NSString)(aString);
 	}
 
-	Object initWithCapacity (NSUInteger capacity)
+	NSString initWithCapacity (NSUInteger capacity)
 	{
 		return invokeObjcSelf!(Object, "initWithCapacity:", NSUInteger)(capacity);
 	}
 
-	this (NSUInteger capacity)
+	/*this (NSUInteger capacity)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCapacity:", NSUInteger)(objcObject, capacity);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
+		typeof(this).alloc.initWithCapacity(capacity);
+	}*/
 
 	static Object stringWithCapacity (NSUInteger capacity)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithCapacity:", NSUInteger)(capacity);
+		return invokeObjcSuperClass!(Object, "stringWithCapacity:", NSUInteger)(capacity);
 	}
 
 	NSUInteger replaceOccurrencesOfString (NSString target, NSString replacement, uint options, NSRange searchRange)
 	{
 		return invokeObjcSelf!(NSUInteger, "replaceOccurrencesOfString:withString:options:range:", NSString, NSString, uint, NSRange)(target, replacement, options, searchRange);
 	}
-}
+`;
 
-template TNSStringExtensionMethods ()
-{
+const TNSStringExtensionMethods = `
+
 	void getCharacters (unichar* buffer)
 	{
 		return invokeObjcSelf!(void, "getCharacters:", unichar*)(buffer);
@@ -539,359 +489,337 @@
 
 	static uint defaultCStringEncoding ()
 	{
-		return invokeObjcSelfClass!(uint, "defaultCStringEncoding");
+		return invokeObjcSuperClass!(uint, "defaultCStringEncoding");
 	}
 
 	static NSStringEncoding* availableStringEncodings ()
 	{
-		return invokeObjcSelfClass!(NSStringEncoding*, "availableStringEncodings");
+		return invokeObjcSuperClass!(NSStringEncoding*, "availableStringEncodings");
 	}
 
 	static NSString localizedNameOfStringEncoding (uint encoding)
 	{
-		return invokeObjcSelfClass!(NSString, "localizedNameOfStringEncoding:", uint)(encoding);
-	}
-
-	Object init ()
-	{
-		return invokeObjcSelf!(Object, "init");
+		return invokeObjcSuperClass!(NSString, "localizedNameOfStringEncoding:", uint)(encoding);
 	}
 
-	this ()
-	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "init")(objcObject);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithCharactersNoCopy (unichar* characters, NSUInteger length, bool freeBuffer)
+	NSString initWithCharactersNoCopy (unichar* characters, NSUInteger length, bool freeBuffer)
 	{
 		return invokeObjcSelf!(Object, "initWithCharactersNoCopy:length:freeWhenDone:", unichar*, NSUInteger, bool)(characters, length, freeBuffer);
 	}
 
-	this (unichar* characters, NSUInteger length, bool freeBuffer)
+	/*this (unichar* characters, NSUInteger length, bool freeBuffer)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCharactersNoCopy:length:freeWhenDone:", unichar*, NSUInteger, bool)(objcObject, characters, length, freeBuffer);
+		typeof(this).alloc.initWithCharactersNoCopy(characters, length, freeBuffer);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithCharacters (unichar* characters, NSUInteger length)
+	NSString initWithCharacters (unichar* characters, NSUInteger length)
 	{
 		return invokeObjcSelf!(Object, "initWithCharacters:length:", unichar*, NSUInteger)(characters, length);
 	}
 
-	this (unichar* characters, NSUInteger length)
+	/*this (unichar* characters, NSUInteger length)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCharacters:length:", unichar*, NSUInteger)(objcObject, characters, length);
+		typeof(this).alloc.initWithCharacters(characters, length);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithUTF8String (char* nullTerminatedCString)
+	NSString initWithUTF8String (char* nullTerminatedCString)
 	{
 		return invokeObjcSelf!(Object, "initWithUTF8String:", char*)(nullTerminatedCString);
 	}
 
-	this (char* nullTerminatedCString)
+	/*this (char* nullTerminatedCString)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithUTF8String:", char*)(objcObject, nullTerminatedCString);
+		typeof(this).alloc.initWithUTF8String(nullTerminatedCString);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithString (NSString aString)
+	NSString initWithString (NSString aString)
 	{
 		return invokeObjcSelf!(Object, "initWithString:", NSString)(aString);
 	}
 
-	this (NSString aString)
+	/*this (NSString aString)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithString:", NSString)(objcObject, aString);
+		typeof(this).alloc.initWithString(aString);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithFormat (NSString initWithFormat, ...)
+	NSString initWithFormat (NSString initWithFormat, ...)
 	{
 		return invokeObjcSelf!(Object, "initWithFormat:", NSString)(initWithFormat);
 	}
 
-	this (NSString initWithFormat, ...)
+	/*this (NSString initWithFormat, ...)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:", NSString)(objcObject, initWithFormat);
+		typeof(this).alloc.initWithFormat(initWithFormat);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithFormat (NSString format, char* argList)
+	NSString initWithFormat (NSString format, char* argList)
 	{
 		return invokeObjcSelf!(Object, "initWithFormat:arguments:", NSString, char*)(format, argList);
 	}
 
-	this (NSString format, char* argList)
+	/*this (NSString format, char* argList)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:arguments:", NSString, char*)(objcObject, format, argList);
+		typeof(this).alloc.initWithFormat(format, argList);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithFormat (NSString format, Object locale, ...)
+	NSString initWithFormat (NSString format, Object locale, ...)
 	{
 		return invokeObjcSelf!(Object, "initWithFormat:locale:", NSString, Object)(format, locale);
 	}
 
-	this (NSString format, Object locale, ...)
+	/*this (NSString format, Object locale, ...)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:locale:", NSString, Object)(objcObject, format, locale);
+		typeof(this).alloc.initWithFormat(format, locale);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithFormat (NSString format, Object locale, char* argList)
+	NSString initWithFormat (NSString format, Object locale, char* argList)
 	{
 		return invokeObjcSelf!(Object, "initWithFormat:locale:arguments:", NSString, Object, char*)(format, locale, argList);
 	}
 
-	this (NSString format, Object locale, char* argList)
+	/*this (NSString format, Object locale, char* argList)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:locale:arguments:", NSString, Object, char*)(objcObject, format, locale, argList);
+		typeof(this).alloc.initWithFormat(format, locale, argList);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithData (NSData data, uint encoding)
+	NSString initWithData (NSData data, uint encoding)
 	{
 		return invokeObjcSelf!(Object, "initWithData:encoding:", NSData, uint)(data, encoding);
 	}
 
-	this (NSData data, uint encoding)
+	/*this (NSData data, uint encoding)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithData:encoding:", NSData, uint)(objcObject, data, encoding);
+		typeof(this).alloc.initWithData(data, encoding);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithBytes (void* bytes, NSUInteger len, uint encoding)
+	NSString initWithBytes (void* bytes, NSUInteger len, uint encoding)
 	{
 		return invokeObjcSelf!(Object, "initWithBytes:length:encoding:", void*, NSUInteger, uint)(bytes, len, encoding);
 	}
 
-	this (void* bytes, NSUInteger len, uint encoding)
+	/*this (void* bytes, NSUInteger len, uint encoding)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithBytes:length:encoding:", void*, NSUInteger, uint)(objcObject, bytes, len, encoding);
+		typeof(this).alloc.initWithBytes(bytes, len, encoding);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+	NSString initWithBytesNoCopy (void* bytes, NSUInteger len, NSStringEncoding encoding, bool freeBuffer)
+	{
+		return invokeObjcSelf!(Object, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, NSStringEncoding, bool)(bytes, len, encoding, freeBuffer);
 	}
 
-	Object initWithBytesNoCopy (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
-	{
-		return invokeObjcSelf!(Object, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, uint, bool)(bytes, len, encoding, freeBuffer);
-	}
-
-	this (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
+	/*this (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, uint, bool)(objcObject, bytes, len, encoding, freeBuffer);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
+		typeof(this).alloc.initWithBytesNoCopy(bytes, len, encoding, freeBuffer);
+	}*/
 
 	static Object string ()
 	{
-		return invokeObjcSelfClass!(Object, "string");
+		return invokeObjcSuperClass!(Object, "string");
 	}
 
 	static Object stringWithString (NSString string)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithString:", NSString)(string);
+		return invokeObjcSuperClass!(Object, "stringWithString:", NSString)(string);
 	}
 
 	static Object stringWithCharacters (unichar* characters, NSUInteger length)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithCharacters:length:", unichar*, NSUInteger)(characters, length);
+		return invokeObjcSuperClass!(Object, "stringWithCharacters:length:", unichar*, NSUInteger)(characters, length);
 	}
 
-	static Object stringWithUTF8String (char* nullTerminatedCString)
+	static NSString stringWithUTF8String (char* nullTerminatedCString)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithUTF8String:", char*)(nullTerminatedCString);
+		return invokeObjcSuperClass!(NSString, "stringWithUTF8String:", char*)(nullTerminatedCString);
 	}
 
 	static Object stringWithFormat (NSString stringWithFormat, ...)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithFormat:", NSString)(stringWithFormat);
+		return invokeObjcSuperClass!(Object, "stringWithFormat:", NSString)(stringWithFormat);
 	}
 
 	static Object localizedStringWithFormat (NSString localizedStringWithFormat, ...)
 	{
-		return invokeObjcSelfClass!(Object, "localizedStringWithFormat:", NSString)(localizedStringWithFormat);
-	}
-
-	Object initWithCString (char* nullTerminatedCString, uint encoding)
-	{
-		return invokeObjcSelf!(Object, "initWithCString:encoding:", char*, uint)(nullTerminatedCString, encoding);
-	}
-
-	this (char* nullTerminatedCString, uint encoding)
-	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCString:encoding:", char*, uint)(objcObject, nullTerminatedCString, encoding);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+		return invokeObjcSuperClass!(Object, "localizedStringWithFormat:", NSString)(localizedStringWithFormat);
 	}
 
 	static Object stringWithCString (char* cString, uint enc)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithCString:encoding:", char*, uint)(cString, enc);
+		return invokeObjcSuperClass!(Object, "stringWithCString:encoding:", char*, uint)(cString, enc);
 	}
 
-	Object initWithContentsOfURL (NSURL url, uint enc, NSError** error)
+	NSString initWithContentsOfURL (NSURL url, NSStringEncoding enc, ref NSError error)
 	{
-		return invokeObjcSelf!(Object, "initWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(url, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSelf!(Object, "initWithContentsOfURL:encoding:error:", NSURL, NSStringEncoding, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;		
 	}
 
-	this (NSURL url, uint enc, NSError** error)
+	/*this (NSURL url, NSStringEncoding enc, ref NSError error)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(objcObject, url, enc, error);
+		typeof(this).alloc.initWithContentsOfURL(url, enc, error);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	Object initWithContentsOfFile (NSString path, uint enc, NSError** error)
+	NSString initWithContentsOfFile (NSString path, NSStringEncoding enc, ref NSError error)
 	{
-		return invokeObjcSelf!(Object, "initWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(path, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSelf!(Object, "initWithContentsOfFile:encoding:error:", NSString, NSStringEncoding, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	this (NSString path, uint enc, NSError** error)
+	/*this (NSString path, NSStringEncoding enc, ref NSError error)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(objcObject, path, enc, error);
+		typeof(this).alloc.initWithContentsOfFile(path, enc, error);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+	static Object stringWithContentsOfURL (NSURL url, NSStringEncoding enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSuperClass!(Object, "stringWithContentsOfURL:encoding:error:", NSURL, NSStringEncoding, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	static Object stringWithContentsOfURL (NSURL url, uint enc, NSError** error)
+	static Object stringWithContentsOfFile (NSString path, NSStringEncoding enc, ref NSError error)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(url, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSuperClass!(Object, "stringWithContentsOfFile:encoding:error:", NSString, NSStringEncoding, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	static Object stringWithContentsOfFile (NSString path, uint enc, NSError** error)
+	NSString initWithContentsOfURL (NSURL url, NSStringEncoding* enc, ref NSError error)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(path, enc, error);
-	}
-
-	Object initWithContentsOfURL (NSURL url, NSStringEncoding* enc, NSError** error)
-	{
-		return invokeObjcSelf!(Object, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(url, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSelf!(Object, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	this (NSURL url, NSStringEncoding* enc, NSError** error)
+	/*this (NSURL url, NSStringEncoding* enc, ref NSError error)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(objcObject, url, enc, error);
+		typeof(this).alloc.initWithContentsOfURL(url, enc, error);
+	}*/
 
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+	NSString initWithContentsOfFile (NSString path, NSStringEncoding* enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSelf!(Object, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	Object initWithContentsOfFile (NSString path, NSStringEncoding* enc, NSError** error)
+	/*this (NSString path, NSStringEncoding* enc, ref NSError error)
+	{
+		typeof(this).alloc.initWithContentsOfFile(path, enc, error);
+	}*/
+
+	static Object stringWithContentsOfURL (NSURL url, NSStringEncoding* enc, ref NSError error)
 	{
-		return invokeObjcSelf!(Object, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(path, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSuperClass!(Object, "stringWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	this (NSString path, NSStringEncoding* enc, NSError** error)
+	static Object stringWithContentsOfFile (NSString path, NSStringEncoding* enc, ref NSError error)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(objcObject, path, enc, error);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
-
-	static Object stringWithContentsOfURL (NSURL url, NSStringEncoding* enc, NSError** error)
-	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(url, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		Object result = invokeObjcSuperClass!(Object, "stringWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	static Object stringWithContentsOfFile (NSString path, NSStringEncoding* enc, NSError** error)
+	bool writeToURL (NSURL url, bool useAuxiliaryFile, uint enc, ref NSError error)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(path, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		bool result = invokeObjcSelf!(bool, "writeToURL:atomically:encoding:error:", NSURL, bool, uint, id*)(url, useAuxiliaryFile, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
 
-	bool writeToURL (NSURL url, bool useAuxiliaryFile, uint enc, NSError** error)
-	{
-		return invokeObjcSelf!(bool, "writeToURL:atomically:encoding:error:", NSURL, bool, uint, NSError**)(url, useAuxiliaryFile, enc, error);
-	}
-
-	bool writeToFile (NSString path, bool useAuxiliaryFile, uint enc, NSError** error)
+	bool writeToFile (NSString path, bool useAuxiliaryFile, uint enc, ref NSError error)
 	{
-		return invokeObjcSelf!(bool, "writeToFile:atomically:encoding:error:", NSString, bool, uint, NSError**)(path, useAuxiliaryFile, enc, error);
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		bool result = invokeObjcSelf!(bool, "writeToFile:atomically:encoding:error:", NSString, bool, uint, id*)(path, useAuxiliaryFile, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
 	}
-}
+`;
 
-template TNSStringDeprecated ()
-{
+const TNSStringDeprecated = `
+
 	char* cString ()
 	{
 		return invokeObjcSelf!(char*, "cString");
@@ -932,104 +860,1105 @@
 		return invokeObjcSelf!(bool, "writeToURL:atomically:", NSURL, bool)(url, atomically);
 	}
 
-	Object initWithContentsOfFile (NSString path)
+	/*NSString initWithContentsOfFile (NSString path)
 	{
 		return invokeObjcSelf!(Object, "initWithContentsOfFile:", NSString)(path);
 	}
 
 	this (NSString path)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:", NSString)(objcObject, path);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+		typeof(this).alloc.initWithContentsOfFile(path);
 	}
 
-	Object initWithContentsOfURL (NSURL url)
+	NSString initWithContentsOfURL (NSURL url)
 	{
 		return invokeObjcSelf!(Object, "initWithContentsOfURL:", NSURL)(url);
 	}
 
 	this (NSURL url)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:", NSURL)(objcObject, url);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
-	}
+		typeof(this).alloc.initWithContentsOfURL(url);
+	}*/
 
 	static Object stringWithContentsOfFile (NSString path)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:", NSString)(path);
+		return invokeObjcSuperClass!(Object, "stringWithContentsOfFile:", NSString)(path);
 	}
 
 	static Object stringWithContentsOfURL (NSURL url)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:", NSURL)(url);
+		return invokeObjcSuperClass!(Object, "stringWithContentsOfURL:", NSURL)(url);
 	}
 
-	Object initWithCStringNoCopy (char* bytes, NSUInteger length, bool freeBuffer)
+	NSString initWithCStringNoCopy (char* bytes, NSUInteger length, bool freeBuffer)
 	{
 		return invokeObjcSelf!(Object, "initWithCStringNoCopy:length:freeWhenDone:", char*, NSUInteger, bool)(bytes, length, freeBuffer);
 	}
 
 	this (char* bytes, NSUInteger length, bool freeBuffer)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCStringNoCopy:length:freeWhenDone:", char*, NSUInteger, bool)(objcObject, bytes, length, freeBuffer);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+		typeof(this).alloc.initWithCStringNoCopy(bytes, length, freeBuffer);
 	}
 
-	Object initWithCString (char* bytes, NSUInteger length)
+	NSString initWithCString (char* bytes, NSUInteger length)
 	{
 		return invokeObjcSelf!(Object, "initWithCString:length:", char*, NSUInteger)(bytes, length);
 	}
 
 	this (char* bytes, NSUInteger length)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCString:length:", char*, NSUInteger)(objcObject, bytes, length);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+		typeof(this).alloc.initWithCString(bytes, length);
 	}
 
-	Object initWithCString (char* bytes)
+	NSString initWithCString (char* bytes)
 	{
 		return invokeObjcSelf!(Object, "initWithCString:", char*)(bytes);
 	}
 
 	this (char* bytes)
 	{
-		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
-		id result = Bridge.invokeObjcMethod!(id, "initWithCString:", char*)(objcObject, bytes);
-
-		if (result)
-			objcObject = ret;
-
-		dObject = this;
+		typeof(this).alloc.initWithCString(bytes);
 	}
 
 	static Object stringWithCString (char* bytes, NSUInteger length)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithCString:length:", char*, NSUInteger)(bytes, length);
+		return invokeObjcSuperClass!(Object, "stringWithCString:length:", char*, NSUInteger)(bytes, length);
 	}
 
 	static Object stringWithCString (char* bytes)
 	{
-		return invokeObjcSelfClass!(Object, "stringWithCString:", char*)(bytes);
+		return invokeObjcSuperClass!(Object, "stringWithCString:", char*)(bytes);
+	}
+`;
+
+class NSMutableString : NSString
+{
+	mixin (ObjcClusterWrap);
+	
+	this ()
+	{
+		super(typeof(this).alloc.init.objcObject);
+	}
+	
+	typeof(this) init ()
+	{
+		return invokeObjcSelf!(typeof(this), "init");
+	}
+	
+	void replaceCharactersInRange (NSRange range, NSString aString)
+	{
+		return invokeObjcSelf!(void, "replaceCharactersInRange:withString:", NSRange, NSString)(range, aString);
+	}
+	
+	// TNSMutableStringExtensionMethods
+	void insertString (NSString aString, NSUInteger loc)
+	{
+		return invokeObjcSelf!(void, "insertString:atIndex:", NSString, NSUInteger)(aString, loc);
+	}
+	
+	void deleteCharactersInRange (NSRange range)
+	{
+		return invokeObjcSelf!(void, "deleteCharactersInRange:", NSRange)(range);
+	}
+	
+	void appendString (NSString aString)
+	{
+		return invokeObjcSelf!(void, "appendString:", NSString)(aString);
+	}
+	
+	void appendFormat (NSString appendFormat, ...)
+	{
+		return invokeObjcSelf!(void, "appendFormat:", NSString)(appendFormat);
+	}
+	
+	void setString (NSString aString)
+	{
+		return invokeObjcSelf!(void, "setString:", NSString)(aString);
+	}
+	
+	NSMutableString initWithCapacity (NSUInteger capacity)
+	{
+		return invokeObjcSelf!(NSMutableString, "initWithCapacity:", NSUInteger)(capacity);
+	}
+	
+	/*this (NSUInteger capacity)
+	{
+		typeof(this).alloc.initWithCapacity(capacity);
+	}*/
+	
+	static NSMutableString stringWithCapacity (NSUInteger capacity)
+	{
+		return invokeObjcSuperClass!(NSMutableString, "stringWithCapacity:", NSUInteger)(capacity);
+	}
+	
+	NSUInteger replaceOccurrencesOfString (NSString target, NSString replacement, uint options, NSRange searchRange)
+	{
+		return invokeObjcSelf!(NSUInteger, "replaceOccurrencesOfString:withString:options:range:", NSString, NSString, uint, NSRange)(target, replacement, options, searchRange);
 	}
 }
 
+class NSString : NSObject, INSCopying, INSMutableCopying, INSCoding
+{
+	mixin (ObjcClusterWrap);
+	
+	this ()
+	{
+		super(typeof(this).alloc.init.objcObject);
+	}
+	
+	typeof(this) init ()
+	{
+		return invokeObjcSelf!(typeof(this), "init");
+	}
+	
+	NSUInteger length ()
+	{
+		return invokeObjcSelf!(NSUInteger, "length");
+	}
+
+	unichar characterAtIndex (NSUInteger index)
+	{
+		return invokeObjcSelf!(unichar, "characterAtIndex:", NSUInteger)(index);
+	}
+
+	NSString copyWithZone (NSZone* zone)
+	{
+		return invokeObjcSelf!(NSString, "copyWithZone:", NSZone*)(zone);
+	}
+
+	NSString mutableCopyWithZone (NSZone* zone)
+	{
+		return invokeObjcSelf!(NSString, "mutableCopyWithZone:", NSZone*)(zone);
+	}
+
+	void encodeWithCoder (NSCoder aCoder)
+	{
+		return invokeObjcSelf!(void, "encodeWithCoder:", NSCoder)(aCoder);
+	}
+
+	NSString initWithCoder (NSCoder aDecoder)
+	{
+		return invokeObjcSelf!(NSString, "initWithCoder:", NSCoder)(aDecoder);
+	}
+
+	this (NSCoder aDecoder)
+	{
+		typeof(this).alloc.initWithCoder(aDecoder);
+	}
+	
+	// TNSExtendedStringPropertyListParsing
+	Object propertyList ()
+	{
+		return invokeObjcSelf!(Object, "propertyList");
+	}
+	
+	NSDictionary propertyListFromStringsFileFormat ()
+	{
+		return invokeObjcSelf!(NSDictionary, "propertyListFromStringsFileFormat");
+	}
+	
+	// TNSStringExtensionMethods
+	void getCharacters (unichar* buffer)
+	{
+		return invokeObjcSelf!(void, "getCharacters:", unichar*)(buffer);
+	}
+	
+	void getCharacters (unichar* buffer, NSRange aRange)
+	{
+		return invokeObjcSelf!(void, "getCharacters:range:", unichar*, NSRange)(buffer, aRange);
+	}
+	
+	NSString substringFromIndex (NSUInteger from)
+	{
+		return invokeObjcSelf!(NSString, "substringFromIndex:", NSUInteger)(from);
+	}
+	
+	NSString substringToIndex (NSUInteger to)
+	{
+		return invokeObjcSelf!(NSString, "substringToIndex:", NSUInteger)(to);
+	}
+	
+	NSString substringWithRange (NSRange range)
+	{
+		return invokeObjcSelf!(NSString, "substringWithRange:", NSRange)(range);
+	}
+	
+	int compare (NSString string)
+	{
+		return invokeObjcSelf!(int, "compare:", NSString)(string);
+	}
+	
+	int compare (NSString string, uint mask)
+	{
+		return invokeObjcSelf!(int, "compare:options:", NSString, uint)(string, mask);
+	}
+	
+	int compare (NSString string, uint mask, NSRange compareRange)
+	{
+		return invokeObjcSelf!(int, "compare:options:range:", NSString, uint, NSRange)(string, mask, compareRange);
+	}
+	
+	int compare (NSString string, uint mask, NSRange compareRange, Object locale)
+	{
+		return invokeObjcSelf!(int, "compare:options:range:locale:", NSString, uint, NSRange, Object)(string, mask, compareRange, locale);
+	}
+	
+	int caseInsensitiveCompare (NSString string)
+	{
+		return invokeObjcSelf!(int, "caseInsensitiveCompare:", NSString)(string);
+	}
+	
+	int localizedCompare (NSString string)
+	{
+		return invokeObjcSelf!(int, "localizedCompare:", NSString)(string);
+	}
+	
+	int localizedCaseInsensitiveCompare (NSString string)
+	{
+		return invokeObjcSelf!(int, "localizedCaseInsensitiveCompare:", NSString)(string);
+	}
+	
+	bool isEqualToString (NSString aString)
+	{
+		return invokeObjcSelf!(bool, "isEqualToString:", NSString)(aString);
+	}
+	
+	bool hasPrefix (NSString aString)
+	{
+		return invokeObjcSelf!(bool, "hasPrefix:", NSString)(aString);
+	}
+	
+	bool hasSuffix (NSString aString)
+	{
+		return invokeObjcSelf!(bool, "hasSuffix:", NSString)(aString);
+	}
+	
+	NSRange rangeOfString (NSString aString)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfString:", NSString)(aString);
+	}
+	
+	NSRange rangeOfString (NSString aString, uint mask)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfString:options:", NSString, uint)(aString, mask);
+	}
+	
+	NSRange rangeOfString (NSString aString, uint mask, NSRange searchRange)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfString:options:range:", NSString, uint, NSRange)(aString, mask, searchRange);
+	}
+	
+	NSRange rangeOfString (NSString aString, uint mask, NSRange searchRange, NSLocale locale)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfString:options:range:locale:", NSString, uint, NSRange, NSLocale)(aString, mask, searchRange, locale);
+	}
+	
+	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:", NSCharacterSet)(aSet);
+	}
+	
+	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet, uint mask)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:options:", NSCharacterSet, uint)(aSet, mask);
+	}
+	
+	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet, uint mask, NSRange searchRange)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:options:range:", NSCharacterSet, uint, NSRange)(aSet, mask, searchRange);
+	}
+	
+	NSRange rangeOfComposedCharacterSequenceAtIndex (NSUInteger index)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfComposedCharacterSequenceAtIndex:", NSUInteger)(index);
+	}
+	
+	NSRange rangeOfComposedCharacterSequencesForRange (NSRange range)
+	{
+		return invokeObjcSelf!(NSRange, "rangeOfComposedCharacterSequencesForRange:", NSRange)(range);
+	}
+	
+	NSString stringByAppendingString (NSString aString)
+	{
+		return invokeObjcSelf!(NSString, "stringByAppendingString:", NSString)(aString);
+	}
+	
+	NSString stringByAppendingFormat (NSString stringByAppendingFormat, ...)
+	{
+		return invokeObjcSelf!(NSString, "stringByAppendingFormat:", NSString)(stringByAppendingFormat);
+	}
+	
+	double doubleValue ()
+	{
+		return invokeObjcSelf!(double, "doubleValue");
+	}
+	
+	float floatValue ()
+	{
+		return invokeObjcSelf!(float, "floatValue");
+	}
+	
+	int intValue ()
+	{
+		return invokeObjcSelf!(int, "intValue");
+	}
+	
+	NSInteger integerValue ()
+	{
+		return invokeObjcSelf!(NSInteger, "integerValue");
+	}
+	
+	long longLongValue ()
+	{
+		return invokeObjcSelf!(long, "longLongValue");
+	}
+	
+	bool boolValue ()
+	{
+		return invokeObjcSelf!(bool, "boolValue");
+	}
+	
+	NSArray componentsSeparatedByString (NSString separator)
+	{
+		return invokeObjcSelf!(NSArray, "componentsSeparatedByString:", NSString)(separator);
+	}
+	
+	NSArray componentsSeparatedByCharactersInSet (NSCharacterSet separator)
+	{
+		return invokeObjcSelf!(NSArray, "componentsSeparatedByCharactersInSet:", NSCharacterSet)(separator);
+	}
+	
+	NSString commonPrefixWithString (NSString aString, uint mask)
+	{
+		return invokeObjcSelf!(NSString, "commonPrefixWithString:options:", NSString, uint)(aString, mask);
+	}
+	
+	NSString uppercaseString ()
+	{
+		return invokeObjcSelf!(NSString, "uppercaseString");
+	}
+	
+	NSString lowercaseString ()
+	{
+		return invokeObjcSelf!(NSString, "lowercaseString");
+	}
+	
+	NSString capitalizedString ()
+	{
+		return invokeObjcSelf!(NSString, "capitalizedString");
+	}
+	
+	NSString stringByTrimmingCharactersInSet (NSCharacterSet set)
+	{
+		return invokeObjcSelf!(NSString, "stringByTrimmingCharactersInSet:", NSCharacterSet)(set);
+	}
+	
+	NSString stringByPaddingToLength (NSUInteger newLength, NSString padString, NSUInteger padIndex)
+	{
+		return invokeObjcSelf!(NSString, "stringByPaddingToLength:withString:startingAtIndex:", NSUInteger, NSString, NSUInteger)(newLength, padString, padIndex);
+	}
+	
+	void getLineStart (NSUInteger* startPtr, NSUInteger* lineEndPtr, NSUInteger* contentsEndPtr, NSRange range)
+	{
+		return invokeObjcSelf!(void, "getLineStart:end:contentsEnd:forRange:", NSUInteger*, NSUInteger*, NSUInteger*, NSRange)(startPtr, lineEndPtr, contentsEndPtr, range);
+	}
+	
+	NSRange lineRangeForRange (NSRange range)
+	{
+		return invokeObjcSelf!(NSRange, "lineRangeForRange:", NSRange)(range);
+	}
+	
+	void getParagraphStart (NSUInteger* startPtr, NSUInteger* parEndPtr, NSUInteger* contentsEndPtr, NSRange range)
+	{
+		return invokeObjcSelf!(void, "getParagraphStart:end:contentsEnd:forRange:", NSUInteger*, NSUInteger*, NSUInteger*, NSRange)(startPtr, parEndPtr, contentsEndPtr, range);
+	}
+	
+	NSRange paragraphRangeForRange (NSRange range)
+	{
+		return invokeObjcSelf!(NSRange, "paragraphRangeForRange:", NSRange)(range);
+	}
+	
+	NSString description ()
+	{
+		return invokeObjcSelf!(NSString, "description");
+	}
+	
+	NSUInteger hash ()
+	{
+		return invokeObjcSelf!(NSUInteger, "hash");
+	}
+	
+	uint fastestEncoding ()
+	{
+		return invokeObjcSelf!(uint, "fastestEncoding");
+	}
+	
+	uint smallestEncoding ()
+	{
+		return invokeObjcSelf!(uint, "smallestEncoding");
+	}
+	
+	NSData dataUsingEncoding (uint encoding, bool lossy)
+	{
+		return invokeObjcSelf!(NSData, "dataUsingEncoding:allowLossyConversion:", uint, bool)(encoding, lossy);
+	}
+	
+	NSData dataUsingEncoding (uint encoding)
+	{
+		return invokeObjcSelf!(NSData, "dataUsingEncoding:", uint)(encoding);
+	}
+	
+	bool canBeConvertedToEncoding (uint encoding)
+	{
+		return invokeObjcSelf!(bool, "canBeConvertedToEncoding:", uint)(encoding);
+	}
+	
+	char* cStringUsingEncoding (uint encoding)
+	{
+		return invokeObjcSelf!(char*, "cStringUsingEncoding:", uint)(encoding);
+	}
+	
+	bool getCString (char* buffer, NSUInteger maxBufferCount, uint encoding)
+	{
+		return invokeObjcSelf!(bool, "getCString:maxLength:encoding:", char*, NSUInteger, uint)(buffer, maxBufferCount, encoding);
+	}
+	
+	bool getBytes (void* buffer, NSUInteger maxBufferCount, NSUInteger* usedBufferCount, uint encoding, uint options, NSRange range, NSRangePointer leftover)
+	{
+		return invokeObjcSelf!(bool, "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:", void*, NSUInteger, NSUInteger*, uint, uint, NSRange, NSRangePointer)(buffer, maxBufferCount, usedBufferCount, encoding, options, range, leftover);
+	}
+	
+	NSUInteger maximumLengthOfBytesUsingEncoding (uint enc)
+	{
+		return invokeObjcSelf!(NSUInteger, "maximumLengthOfBytesUsingEncoding:", uint)(enc);
+	}
+	
+	NSUInteger lengthOfBytesUsingEncoding (uint enc)
+	{
+		return invokeObjcSelf!(NSUInteger, "lengthOfBytesUsingEncoding:", uint)(enc);
+	}
+	
+	NSString decomposedStringWithCanonicalMapping ()
+	{
+		return invokeObjcSelf!(NSString, "decomposedStringWithCanonicalMapping");
+	}
+	
+	NSString precomposedStringWithCanonicalMapping ()
+	{
+		return invokeObjcSelf!(NSString, "precomposedStringWithCanonicalMapping");
+	}
+	
+	NSString decomposedStringWithCompatibilityMapping ()
+	{
+		return invokeObjcSelf!(NSString, "decomposedStringWithCompatibilityMapping");
+	}
+	
+	NSString precomposedStringWithCompatibilityMapping ()
+	{
+		return invokeObjcSelf!(NSString, "precomposedStringWithCompatibilityMapping");
+	}
+	
+	NSString stringByFoldingWithOptions (uint options, NSLocale locale)
+	{
+		return invokeObjcSelf!(NSString, "stringByFoldingWithOptions:locale:", uint, NSLocale)(options, locale);
+	}
+	
+	NSString stringByReplacingOccurrencesOfString (NSString target, NSString replacement, uint options, NSRange searchRange)
+	{
+		return invokeObjcSelf!(NSString, "stringByReplacingOccurrencesOfString:withString:options:range:", NSString, NSString, uint, NSRange)(target, replacement, options, searchRange);
+	}
+	
+	NSString stringByReplacingOccurrencesOfString (NSString target, NSString replacement)
+	{
+		return invokeObjcSelf!(NSString, "stringByReplacingOccurrencesOfString:withString:", NSString, NSString)(target, replacement);
+	}
+	
+	NSString stringByReplacingCharactersInRange (NSRange range, NSString replacement)
+	{
+		return invokeObjcSelf!(NSString, "stringByReplacingCharactersInRange:withString:", NSRange, NSString)(range, replacement);
+	}
+	
+	char* UTF8String ()
+	{
+		return invokeObjcSelf!(char*, "UTF8String");
+	}
+	
+	static uint defaultCStringEncoding ()
+	{
+		return invokeObjcSuperClass!(uint, "defaultCStringEncoding");
+	}
+	
+	static NSStringEncoding* availableStringEncodings ()
+	{
+		return invokeObjcSuperClass!(NSStringEncoding*, "availableStringEncodings");
+	}
+	
+	static NSString localizedNameOfStringEncoding (uint encoding)
+	{
+		return invokeObjcSuperClass!(NSString, "localizedNameOfStringEncoding:", uint)(encoding);
+	}
+	
+	NSString initWithCharactersNoCopy (unichar* characters, NSUInteger length, bool freeBuffer)
+	{
+		return invokeObjcSelf!(NSString, "initWithCharactersNoCopy:length:freeWhenDone:", unichar*, NSUInteger, bool)(characters, length, freeBuffer);
+	}
+	
+	/*this (unichar* characters, NSUInteger length, bool freeBuffer)
+	{
+		typeof(this).alloc.initWithCharactersNoCopy(characters, length, freeBuffer);
+	}*/
+	
+	NSString initWithCharacters (unichar* characters, NSUInteger length)
+	{
+		return invokeObjcSelf!(NSString, "initWithCharacters:length:", unichar*, NSUInteger)(characters, length);
+	}
+	
+	/*this (unichar* characters, NSUInteger length)
+	{
+		typeof(this).alloc.initWithCharacters(characters, length);
+	}*/
+	
+	NSString initWithUTF8String (char* nullTerminatedCString)
+	{
+		return invokeObjcSelf!(NSString, "initWithUTF8String:", char*)(nullTerminatedCString);
+	}
+	
+	/*this (char* nullTerminatedCString)
+	{
+		typeof(this).alloc.initWithUTF8String(nullTerminatedCString);
+	}*/
+	
+	NSString initWithString (NSString aString)
+	{
+		return invokeObjcSelf!(NSString, "initWithString:", NSString)(aString);
+	}
+	
+	/*this (NSString aString)
+	{
+		typeof(this).alloc.initWithString(aString);
+	}*/
+	
+	NSString initWithFormat (NSString initWithFormat, ...)
+	{
+		return invokeObjcSelf!(NSString, "initWithFormat:", NSString)(initWithFormat);
+	}
+	
+	/*this (NSString initWithFormat, ...)
+	{
+		typeof(this).alloc.initWithFormat(initWithFormat);
+	}*/
+	
+	NSString initWithFormat (NSString format, char* argList)
+	{
+		return invokeObjcSelf!(NSString, "initWithFormat:arguments:", NSString, char*)(format, argList);
+	}
+	
+	/*this (NSString format, char* argList)
+	{
+		typeof(this).alloc.initWithFormat(format, argList);
+	}*/
+	
+	NSString initWithFormat (NSString format, Object locale, ...)
+	{
+		return invokeObjcSelf!(NSString, "initWithFormat:locale:", NSString, Object)(format, locale);
+	}
+	
+	/*this (NSString format, Object locale, ...)
+	{
+		typeof(this).alloc.initWithFormat(format, locale);
+	}*/
+	
+	NSString initWithFormat (NSString format, Object locale, char* argList)
+	{
+		return invokeObjcSelf!(NSString, "initWithFormat:locale:arguments:", NSString, Object, char*)(format, locale, argList);
+	}
+	
+	/*this (NSString format, Object locale, char* argList)
+	{
+		typeof(this).alloc.initWithFormat(format, locale, argList);
+	}*/
+	
+	NSString initWithData (NSData data, uint encoding)
+	{
+		return invokeObjcSelf!(NSString, "initWithData:encoding:", NSData, uint)(data, encoding);
+	}
+	
+	/*this (NSData data, uint encoding)
+	{
+		typeof(this).alloc.initWithData(data, encoding);
+	}*/
+	
+	NSString initWithBytes (void* bytes, NSUInteger len, uint encoding)
+	{
+		return invokeObjcSelf!(NSString, "initWithBytes:length:encoding:", void*, NSUInteger, uint)(bytes, len, encoding);
+	}
+	
+	/*this (void* bytes, NSUInteger len, uint encoding)
+	{
+		typeof(this).alloc.initWithBytes(bytes, len, encoding);
+	}*/
+	
+	NSString initWithBytesNoCopy (void* bytes, NSUInteger len, NSStringEncoding encoding, bool freeBuffer)
+	{
+		return invokeObjcSelf!(NSString, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, NSStringEncoding, bool)(bytes, len, encoding, freeBuffer);
+	}
+	
+	/*this (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
+	{
+		typeof(this).alloc.initWithBytesNoCopy(bytes, len, encoding, freeBuffer);
+	}*/
+	
+	static NSString string ()
+	{
+		return invokeObjcSuperClass!(NSString, "string");
+	}
+	
+	static NSString stringWithString (NSString string)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithString:", NSString)(string);
+	}
+	
+	static NSString stringWithCharacters (unichar* characters, NSUInteger length)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithCharacters:length:", unichar*, NSUInteger)(characters, length);
+	}
+	
+	static NSString stringWithUTF8String (char* nullTerminatedCString)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithUTF8String:", char*)(nullTerminatedCString);
+	}
+	
+	static NSString stringWithFormat (NSString stringWithFormat, ...)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithFormat:", NSString)(stringWithFormat);
+	}
+	
+	static NSString localizedStringWithFormat (NSString localizedStringWithFormat, ...)
+	{
+		return invokeObjcSuperClass!(NSString, "localizedStringWithFormat:", NSString)(localizedStringWithFormat);
+	}
+	
+	static NSString stringWithCString (char* cString, uint enc)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithCString:encoding:", char*, uint)(cString, enc);
+	}
+	
+	NSString initWithContentsOfURL (NSURL url, NSStringEncoding enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSelf!(NSString, "initWithContentsOfURL:encoding:error:", NSURL, NSStringEncoding, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;		
+	}
+	
+	/*this (NSURL url, NSStringEncoding enc, ref NSError error)
+	{
+		typeof(this).alloc.initWithContentsOfURL(url, enc, error);
+	}*/
+	
+	NSString initWithContentsOfFile (NSString path, NSStringEncoding enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSelf!(NSString, "initWithContentsOfFile:encoding:error:", NSString, NSStringEncoding, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	/*this (NSString path, NSStringEncoding enc, ref NSError error)
+	{
+		typeof(this).alloc.initWithContentsOfFile(path, enc, error);
+	}*/
+	
+	static NSString stringWithContentsOfURL (NSURL url, NSStringEncoding enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSuperClass!(NSString, "stringWithContentsOfURL:encoding:error:", NSURL, NSStringEncoding, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	static NSString stringWithContentsOfFile (NSString path, NSStringEncoding enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSuperClass!(NSString, "stringWithContentsOfFile:encoding:error:", NSString, NSStringEncoding, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	NSString initWithContentsOfURL (NSURL url, NSStringEncoding* enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSelf!(NSString, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	/*this (NSURL url, NSStringEncoding* enc, ref NSError error)
+	{
+		typeof(this).alloc.initWithContentsOfURL(url, enc, error);
+	}*/
+	
+	NSString initWithContentsOfFile (NSString path, NSStringEncoding* enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSelf!(NSString, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	/*this (NSString path, NSStringEncoding* enc, ref NSError error)
+	{
+		typeof(this).alloc.initWithContentsOfFile(path, enc, error);
+	}*/
+	
+	static NSString stringWithContentsOfURL (NSURL url, NSStringEncoding* enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSuperClass!(NSString, "stringWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, id*)(url, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	static NSString stringWithContentsOfFile (NSString path, NSStringEncoding* enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		NSString result = invokeObjcSuperClass!(NSString, "stringWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, id*)(path, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	bool writeToURL (NSURL url, bool useAuxiliaryFile, uint enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		bool result = invokeObjcSelf!(bool, "writeToURL:atomically:encoding:error:", NSURL, bool, uint, id*)(url, useAuxiliaryFile, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	bool writeToFile (NSString path, bool useAuxiliaryFile, uint enc, ref NSError error)
+	{
+		id err;
+		
+		if (error)
+			err = new objc_object;
+		
+		bool result = invokeObjcSelf!(bool, "writeToFile:atomically:encoding:error:", NSString, bool, uint, id*)(path, useAuxiliaryFile, enc, &err);
+		
+		if (err)
+			error = new NSError(err);
+		
+		return result;
+	}
+	
+	// TNSStringPathExtensions
+	static NSString pathWithComponents (NSArray components)
+	{
+		return invokeObjcSuperClass!(NSString, "pathWithComponents:", NSArray)(components);
+	}
+	
+	NSArray pathComponents ()
+	{
+		return invokeObjcSelf!(NSArray, "pathComponents");
+	}
+	
+	bool isAbsolutePath ()
+	{
+		return invokeObjcSelf!(bool, "isAbsolutePath");
+	}
+	
+	NSString lastPathComponent ()
+	{
+		return invokeObjcSelf!(NSString, "lastPathComponent");
+	}
+	
+	NSString stringByDeletingLastPathComponent ()
+	{
+		return invokeObjcSelf!(NSString, "stringByDeletingLastPathComponent");
+	}
+	
+	NSString stringByAppendingPathComponent (NSString str)
+	{
+		return invokeObjcSelf!(NSString, "stringByAppendingPathComponent:", NSString)(str);
+	}
+	
+	NSString pathExtension ()
+	{
+		return invokeObjcSelf!(NSString, "pathExtension");
+	}
+	
+	NSString stringByDeletingPathExtension ()
+	{
+		return invokeObjcSelf!(NSString, "stringByDeletingPathExtension");
+	}
+	
+	NSString stringByAppendingPathExtension (NSString str)
+	{
+		return invokeObjcSelf!(NSString, "stringByAppendingPathExtension:", NSString)(str);
+	}
+	
+	NSString stringByAbbreviatingWithTildeInPath ()
+	{
+		return invokeObjcSelf!(NSString, "stringByAbbreviatingWithTildeInPath");
+	}
+	
+	NSString stringByExpandingTildeInPath ()
+	{
+		return invokeObjcSelf!(NSString, "stringByExpandingTildeInPath");
+	}
+	
+	NSString stringByStandardizingPath ()
+	{
+		return invokeObjcSelf!(NSString, "stringByStandardizingPath");
+	}
+	
+	NSString stringByResolvingSymlinksInPath ()
+	{
+		return invokeObjcSelf!(NSString, "stringByResolvingSymlinksInPath");
+	}
+	
+	NSArray stringsByAppendingPaths (NSArray paths)
+	{
+		return invokeObjcSelf!(NSArray, "stringsByAppendingPaths:", NSArray)(paths);
+	}
+	
+	NSUInteger completePathIntoString (NSString** outputName, bool flag, NSArray** outputArray, NSArray filterTypes)
+	{
+		return invokeObjcSelf!(NSUInteger, "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:", NSString**, bool, NSArray**, NSArray)(outputName, flag, outputArray, filterTypes);
+	}
+	
+	char* fileSystemRepresentation ()
+	{
+		return invokeObjcSelf!(char*, "fileSystemRepresentation");
+	}
+	
+	bool getFileSystemRepresentation (char* cname, NSUInteger max)
+	{
+		return invokeObjcSelf!(bool, "getFileSystemRepresentation:maxLength:", char*, NSUInteger)(cname, max);
+	}
+	
+	// TNSURLUtilities
+	NSString stringByAddingPercentEscapesUsingEncoding (uint enc)
+	{
+		return invokeObjcSelf!(NSString, "stringByAddingPercentEscapesUsingEncoding:", uint)(enc);
+	}
+	
+	NSString stringByReplacingPercentEscapesUsingEncoding (uint enc)
+	{
+		return invokeObjcSelf!(NSString, "stringByReplacingPercentEscapesUsingEncoding:", uint)(enc);
+	}
+	
+	// TNSStringDeprecated
+	char* cString ()
+	{
+		return invokeObjcSelf!(char*, "cString");
+	}
+	
+	char* lossyCString ()
+	{
+		return invokeObjcSelf!(char*, "lossyCString");
+	}
+	
+	NSUInteger cStringLength ()
+	{
+		return invokeObjcSelf!(NSUInteger, "cStringLength");
+	}
+	
+	void getCString (char* bytes)
+	{
+		return invokeObjcSelf!(void, "getCString:", char*)(bytes);
+	}
+	
+	void getCString (char* bytes, NSUInteger maxLength)
+	{
+		return invokeObjcSelf!(void, "getCString:maxLength:", char*, NSUInteger)(bytes, maxLength);
+	}
+	
+	void getCString (char* bytes, NSUInteger maxLength, NSRange aRange, NSRangePointer leftoverRange)
+	{
+		return invokeObjcSelf!(void, "getCString:maxLength:range:remainingRange:", char*, NSUInteger, NSRange, NSRangePointer)(bytes, maxLength, aRange, leftoverRange);
+	}
+	
+	bool writeToFile (NSString path, bool useAuxiliaryFile)
+	{
+		return invokeObjcSelf!(bool, "writeToFile:atomically:", NSString, bool)(path, useAuxiliaryFile);
+	}
+	
+	bool writeToURL (NSURL url, bool atomically)
+	{
+		return invokeObjcSelf!(bool, "writeToURL:atomically:", NSURL, bool)(url, atomically);
+	}
+	
+	NSString initWithContentsOfFile (NSString path)
+	{
+		return invokeObjcSelf!(NSString, "initWithContentsOfFile:", NSString)(path);
+	}
+
+	NSString initWithContentsOfURL (NSURL url)
+	{
+		return invokeObjcSelf!(NSString, "initWithContentsOfURL:", NSURL)(url);
+	}
+	
+	static NSString stringWithContentsOfFile (NSString path)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithContentsOfFile:", NSString)(path);
+	}
+	
+	static NSString stringWithContentsOfURL (NSURL url)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithContentsOfURL:", NSURL)(url);
+	}
+	
+	NSString initWithCStringNoCopy (char* bytes, NSUInteger length, bool freeBuffer)
+	{
+		return invokeObjcSelf!(NSString, "initWithCStringNoCopy:length:freeWhenDone:", char*, NSUInteger, bool)(bytes, length, freeBuffer);
+	}
+	
+	/*this (char* bytes, NSUInteger length, bool freeBuffer)
+	{
+		typeof(this).alloc.initWithCStringNoCopy(bytes, length, freeBuffer);
+	}*/
+	
+	NSString initWithCString (char* bytes, NSUInteger length)
+	{
+		return invokeObjcSelf!(NSString, "initWithCString:length:", char*, NSUInteger)(bytes, length);
+	}
+	
+	/*this (char* bytes, NSUInteger length)
+	{
+		typeof(this).alloc.initWithCString(bytes, length);
+	}*/
+	
+	NSString initWithCString (char* bytes)
+	{
+		return invokeObjcSelf!(NSString, "initWithCString:", char*)(bytes);
+	}
+	
+	/*this (char* bytes)
+	{
+		typeof(this).alloc.initWithCString(bytes);
+	}*/
+	
+	static NSString stringWithCString_length (char* bytes, NSUInteger length)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithCString:length:", char*, NSUInteger)(bytes, length);
+	}
+	
+	static NSString stringWithCString (char* bytes)
+	{
+		return invokeObjcSuperClass!(NSString, "stringWithCString:", char*)(bytes);
+	}
+	
+	// D extensions
+	static NSString opCall (.string str)
+	{
+		return stringWithUTF8String((str ~ '\0').ptr);
+	}
+	
+	equals_t opEquals (Object object)
+	{
+		if (auto str = cast(NSString) object)
+			return isEqual(object);
+		
+		return false;
+	}
+	
+	final equals_t opEquals (.string str)
+	{
+		return str == cStringUsingEncoding(NSUTF8StringEncoding)[0 .. lengthOfBytesUsingEncoding(NSUTF8StringEncoding)];
+	}
+	
+	NSString opCatAssign (NSString str)
+	{
+		objcObject = stringByAppendingString(str).objcObject;
+		return this;
+	}
+	
+	NSString opCatAssign (.string str)
+	{
+		objcObject = stringByAppendingString(NSString(str)).objcObject;
+		return this;
+	}
+	
+	NSString opCat (NSString str)
+	{
+		return stringByAppendingString(str);
+	}
+	
+	NSString opCat (.string str)
+	{
+		return stringByAppendingString(NSString(str));
+	}
+	
+	.string toString ()
+	{
+		return cStringUsingEncoding(NSUTF8StringEncoding)[0 .. lengthOfBytesUsingEncoding(NSUTF8StringEncoding)];
+	}
+	
+	wchar opIndex (size_t index)
+	{
+		return characterAtIndex(index);
+	}
+}
\ No newline at end of file