 	//  Methods
 	//
 	//--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    public function clone():LocaleID {
+
+       var copy:LocaleID = new LocaleID();
+       copy.lang = lang;
+       copy.script = script;
+       copy.region = region;
+       copy.extended_langs = extended_langs.concat();
+       copy.variants = variants.concat();
+       copy.extensions = {};
+       for (var i:String in extensions)
+       {
+           if (extensions.hasOwnProperty(i))
+           {
+           	    copy.extensions[i] = extensions[i].concat();
+           }
+       }
+           
+        copy.privates = privates.concat();
+        copy.privateLangs = privateLangs;
+    
+        return copy;
+    }
 
 	/**
      *  @private

		
		var i:int;
        var j:int;
        var k:int;
        var l:int;
		var locale:String;
		
		var locales:Array = trimAndNormalize(appLocales);
		var preferenceLocales:Array	= trimAndNormalize(systemPreferences);
		
		addUltimateFallbackLocale(preferenceLocales, ultimateFallbackLocale);
		
		// For better performance, save the locales in a lookup table.
		for (j = 0; j < locales.length; j++)
        {
			hasLocale[locales[j]] = j;
		}

			}
			
			// Parse it again.
			plocale = preferenceLocalesID[i].clone();
			
            // Step 3: Promote the order of siblings from preferenceLocales.
			for (j = 0; j < noPreferenceLocales; j++)
            {
				if (plocale.isSiblingOf(preferenceLocalesID[j]))
					promote(preferenceLocales[j]);
			}
            				
			// Step 4: Promote all remaining siblings
            // (aka not in preferenceLocales)
			// eg. push en_UK after en_US and en if the user
            // doesn't have en_UK in the preference list
			for (j = 0; j < noLocales; j++)
            {
				if (plocale.isSiblingOf(localesID[j]))
					promote(locales[j]);
			}
		}
		
