* @param client
	 */
	private void cmd_look(final String arg, final Client client) {
		final Player player = getPlayer(client);
		final Room room = getRoom( player.getLocation() );
		
		debug("Look Command");

		final String[] args = arg.split(" ");
		
		for (final String s : args) {
			debug(s);
		}

		// if no argument or empty argument, show the room
		if (arg.equals("")) {
			player.setTarget(room);
			
			look(room, client);
			
			return;
		}
		else {
			debug("Argument (String): " + arg);

			if (arg.toLowerCase().equals("here")) {
				player.setTarget(room);
				look(room, client);
				return;
			}
			else if (arg.toLowerCase().equals("me")) {
				player.setTarget(player);
				look(player, client);
				return;
			}
			else {
				// decide what else is visible and then find the best match in
				// there
				ArrayList<MUDObject> objectsFound = findVisibleObjects(room);
				objectsFound.addAll(player.getInventory());

				int spec = 0;

				// supposed to handle a syntactical structure like 'sword.2'
				if (arg.contains(".")) {
					spec = Integer.parseInt(arg.substring(arg.indexOf('.')));
					debug("Specifier: " + spec);
				}

				debug("Objects Found: " + objectsFound);

				// just the items in the current room (looks here first)
				for (MUDObject m : objectsFound) {
					final String name = m.getName();
					final List<String> components = Arrays.asList(m.getName().toLowerCase().split(" "));

					String name_lc = name.toLowerCase();
					String arg_lc = arg.toLowerCase();

					debug("Argument:              " + arg);
					debug("Name:                  " + name);
					debug("Argument (Lower Case): " + arg_lc);
					debug("Name (Lower Case):     " + name_lc);
					debug("Components:            " + components);

					/*
					 * 1) is the name the same as ARG (ignoring case -- setting
					 * both name and arg to lowercase) 2) does the name start
					 * with ARG (ignoring case -- setting both name and arg to
					 * lowercase) 3) does the name end with ARG (ignoring case
					 * -- setting both name and arg to lowercase) 4) does the
					 * name contain ARG (ignoring case -- setting both name and
					 * arg to lowercase) 5) is any component of the name the
					 * same as the arg (continues non-whitespace separated
					 * segments)
					 */

					boolean sameName = name.equalsIgnoreCase(arg);
					boolean startsWith = name_lc.startsWith(arg_lc);
					boolean endsWith = name_lc.endsWith(arg_lc);
					boolean nameContains = name_lc.contains(arg_lc);
					boolean compsContain = components.contains(arg_lc);

					boolean test = false;

					for (String s : components) {
						for (String s1 : Arrays.asList(arg.toLowerCase().split(" "))) {
							if (s.contains(s1)) test = true;
							break;
						}
					}

					// for string in A, is A.S a substring of string name N.S
					if (sameName || startsWith || endsWith || nameContains || compsContain || test) {
						player.setTarget(m);
						look(m, client);
						return;
					}
				}

				// not sure if look should apply to dbrefs/any old name,
				// permissions?
				final int dbref = Utils.toInt(arg, -1);
				MUDObject m = null;

				if (dbref != -1) {
					m = getObject(dbref);
				}
				else {
					if (spec == 0) {
						m = getObject(arg);
					}

					// else { MUDObject[] mObjs = getObjects(arg); }
				}

				if (m != null) {
					debug("MUDObject : " + m.getDBRef() + " " + m.getName());
					
					player.setTarget(m);

					if (m instanceof Player)    look((Player) m, client);
					else if (m instanceof Room) look((Room) m, client);
					else                        look(m, client);
				}
			}
		}
	}