 	object.get exp.property.name
 
 
+call = (exp, env, closure, thisArgument) ->
+	# every function gets its scope
+	newEnv = closure.env.addEntry()
+
+	# own name
+	if closure.ownName?
+		newEnv.addBinding closure.ownName.name, closure
+
+	# this
+	newEnv.addBinding 'this', thisArgument
+
+	# arguments
+	exp.arguments.forEach (argument, index) ->
+		value = ev argument, env
+
+		# all parameters must be evaluated but only named
+		# ones must be bound in the new environment
+		if index < closure.formalArguments.length
+			name = closure.formalArguments[index]
+			newEnv.addBinding name, value
+		return
+
+	# vars
+	closure.body.vars.forEach (name) ->
+		newEnv.addBinding name, UNDEFINED
+		return
+
+	# function declarations
+	closure.body.functionDeclarations.forEach (node) ->
+		name = node.id.name
+		closure = ev node, newEnv
+		newEnv.addBinding name, closure
+		return
+
+	ev closure.body, newEnv
+
+
 Nodes['CallExpression'] = (exp, env) ->
 	# determine if it's a method or a function call
 	if exp.callee.type == 'MemberExpression'

		thisArgument = NULL
		closure = ev exp.callee, env

	# every function gets its scope
	newEnv = closure.env.addEntry()

	# own name
	if closure.ownName?
		newEnv.addBinding closure.ownName.name, closure

	# this
	newEnv.addBinding 'this', thisArgument

	# arguments
	exp.arguments.forEach (argument, index) ->
		value = ev argument, env

		# all parameters must be evaluated but only named
		# ones must be bound in the new environment
		if index < closure.formalArguments.length
			name = closure.formalArguments[index]
			newEnv.addBinding name, value
		return

	# vars
	closure.body.vars.forEach (name) ->
		newEnv.addBinding name, UNDEFINED
		return

	# function declarations
	closure.body.functionDeclarations.forEach (node) ->
		name = node.id.name
		closure = ev node, newEnv
		newEnv.addBinding name, closure
		return

	returnCandidate = ev closure.body, newEnv

	if returnCandidate?.return
		returnCandidate.value

	closure = ev exp.callee, env
	thisArgument = new OBJECT closure.get 'prototype'

	returnCandidate = call exp, env, closure, thisArgument

	if returnCandidate?.return and returnCandidate.value instanceof OBJECT
			returnCandidate.value
