private static Node dot(Node recieverNode, Node call)
	{
		Argument reciever = recieverNode.getArgument();
		if (!(call instanceof Reference))
			throw new EvaluationException(call, "Can not invoke " + call);
		
		Reference ref = (Reference) call;
		String name = ref.getName();
		Argument[] args = ref.resolveArguments();
		try
		{
			Config config = recieverNode.getExpression().getConfig();
			Object result = config.invoke(reciever, name, args);
			return (Node) Config.wrap(recieverNode, result, false);
		}
		catch (NoSuchFieldException e)
		{
			throw new EvaluationException(call,
					"Field '" + name + "' not found for " + reciever.getType().getName(), e);
		}
		catch (NoSuchMethodException e)
		{
			StringBuilder builder = new StringBuilder();
			builder.append("Method ").append(name);
			builder.append('(');
			for (int i = 0; i < args.length; i++)
			{
				if (i > 0) builder.append(", ");
				builder.append(args[i].getType());
			}
			builder.append(')');
			builder.append(" not found for ").append(reciever.getType().getName());
			
			throw new EvaluationException(call, builder.toString(), e);
		}
		catch (Exception e)
		{
			throw new EvaluationException(call, "Can not invoke " + name, e);
		}
	}