 					throw new Error("Misplaced '" + tokens[i] + "'");
 				tokens.splice(i - 1, 3, compileVariableAssignment(tokens[i - 1], tokens[i], tokens[i + 1]));
 			}
+			
+			//next step: object literal property declarations: [variable, ":", expr]
+			for (i = 0; i < tokens.length; i++)
+			{
+				if (tokens[i + 1] == ':' && tokens[i + 2] is ICompiledObject)
+				{
+					var constant:CompiledConstant = tokens[i] as CompiledConstant;
+					if (constant && !(constant.value is String) && constants.hasOwnProperty(constant.name) && isValidSymbolName(constant.name))
+						constant = new CompiledConstant(constant.name, constant.name);
+					
+					call = tokens[i] as CompiledFunctionCall;
+					if (isVariableLookup(call))
+						constant = call.compiledMethod as CompiledConstant;
+					
+					if (constant && constant.value is String)
+						tokens.splice(i, 3, compileOperator(":", [constant, tokens[i + 2]]));
+				}
+			}
+			// stop if any ":" remain
+			if (tokens.indexOf(':') >= 0)
+				throw new Error('Misplaced ":"');
 			
 			// next step: commas
 			compileInfixOperators(tokens, [',']);

								if (method === Object)
								{
									var params:Array = call.evaluatedParams;
									result = {}
									for (i = 0; i < params.length - 1; i += 2)
										result[params[i]] = params[i + 1];
								}

			};
			operators[FUNCTION] = function(..._):*{};
			operators['=>'] = function(..._):*{};
			operators[':'] = function(key:String, value:*):* { this[key] = value; };
			// property access should not be optimized to constants
			operators["."] = function(object:*, ...chain):* {
				var iHost:int = chain.length - 2;
