asKeyArray = function asKeyArray(name, object) {

        // If already an array, just coerce into a true Key[] 
        if (object instanceof Array) {
            var keys = [];
            for (var i=0; i < object.length; i++) {
                keys.push(new Guacamole.OnScreenKeyboard.Key(object[i], name));
            }
            return keys;
        }

        // Derive key object from keysym if that's all we have
        if (typeof object === 'number') {
            return [new Guacamole.OnScreenKeyboard.Key({
                name   : name,
                keysym : object
            })];
        }

        // Derive key object from title if that's all we have
        if (typeof object === 'string') {
            return [new Guacamole.OnScreenKeyboard.Key({
                name  : name,
                title : object
            })];
        }

        // Otherwise, assume it's already a key object, just not an array
        return [new Guacamole.OnScreenKeyboard.Key(object, name)];

    }
Given the name of a key and its corresponding definition, which may be
an array of keys objects, a number (keysym), a string (key title), or a
single key object, returns an array of key objects, deriving any missing
properties as needed, and ensuring the key name is defined.

@private
@param {String} name
    The name of the key being coerced into an array of Key objects.

@param {Number|String|Guacamole.OnScreenKeyboard.Key|Guacamole.OnScreenKeyboard.Key[]} object
    The object defining the behavior of the key having the given name,
    which may be the title of the key (a string), the keysym (a number),
    a single Key object, or an array of Key objects.
    
@returns {Guacamole.OnScreenKeyboard.Key[]}
    An array of all keys associated with the given name.