function(url, val){

        // Create a new object that we can manipulate safely.
        var object = extend({}, val);

        // Flag so we remember to append any attributes that can't be bound.
        var append = false;

        // If there are still parameters to bind, pull them out.
        // Note: We use a different regex here because we need the global flag to ensure we pull all remaining bindings.
        var remaining = url.match(/:\w+/ig);
        if (remaining && remaining.length > 0){

            // Iterate over the remaining potential bindings, looking for matches by name.
            for (var j = 0; j < remaining.length; j++){

                // Grab the key, stripping the : character.
                var key = remaining[j].replace(':', '');

                // Does our object contain that key?
                if (object[key] !== undefined){

                    // Is it a type we can serialise?
                    if (this.canSerialise(object[key])){

                        // If it is, replace that value.
                        var keyRegex = new RegExp(':' + key);
                        url = url.replace(keyRegex, object[key]);
                    }

                    // Even if it wasn't, delete the value so we don't try again later.
                    delete object[key];
                }
            }

            // If there are still fields left on our object, they need to become query parameters.
            if (object !== {}){
                append = true;
            }
        }

        // Otherwise, we're going to append the object's values as key/value pairs.
        else {
            append = true;
        }

        // If we need to append key/values, do so.
        if (append){

            for (var attr in object){

                // If the value is an object or a function, ignore it.
                if (this.canSerialise(object[attr])){

                    // How are we appending?
                    var joiner = (url.indexOf('?') >= 0) ? "&" : "?";

                    // Append.
                    url += joiner + attr + "=" + object[attr];
                }
            }
        }

        return url;
    }
function(url, val){

        
        var object = extend({}, val);

        
        var append = false;

        
        
        var remaining = url.match(/:\w+/ig);
        if (remaining && remaining.length > 0){

            
            for (var j = 0; j < remaining.length; j++){

                
                var key = remaining[j].replace(':', '');

                
                if (object[key] !== undefined){

                    
                    if (this.canSerialise(object[key])){

                        
                        var keyRegex = new RegExp(':' + key);
                        url = url.replace(keyRegex, object[key]);
                    }

                    
                    delete object[key];
                }
            }

            
            if (object !== {}){
                append = true;
            }
        }

        
        else {
            append = true;
        }

        
        if (append){

            for (var attr in object){

                
                if (this.canSerialise(object[attr])){

                    
                    var joiner = (url.indexOf('?') >= 0) ? "&" : "?";

                    
                    url += joiner + attr + "=" + object[attr];
                }
            }
        }

        return url;
    }
function ( url , val ) { // Create a new object that we can manipulate safely. var object = extend ( { } , val ) ; // Flag so we remember to append any attributes that can't be bound. var append = false ; // If there are still parameters to bind, pull them out. // Note: We use a different regex here because we need the global flag to ensure we pull all remaining bindings. var remaining = url . match ( / :\w+ / ig ) ; if ( remaining && remaining . length > 0 ) { // Iterate over the remaining potential bindings, looking for matches by name. for ( var j = 0 ; j < remaining . length ; j ++ ) { // Grab the key, stripping the : character. var key = remaining [ j ] . replace ( ':' , '' ) ; // Does our object contain that key? if ( object [ key ] !== undefined ) { // Is it a type we can serialise? if ( this . canSerialise ( object [ key ] ) ) { // If it is, replace that value. var keyRegex = new RegExp ( ':' + key ) ; url = url . replace ( keyRegex , object [ key ] ) ; } // Even if it wasn't, delete the value so we don't try again later. delete object [ key ] ; } } // If there are still fields left on our object, they need to become query parameters. if ( object !== { } ) { append = true ; } } // Otherwise, we're going to append the object's values as key/value pairs. else { append = true ; } // If we need to append key/values, do so. if ( append ) { for ( var attr in object ) { // If the value is an object or a function, ignore it. if ( this . canSerialise ( object [ attr ] ) ) { // How are we appending? var joiner = ( url . indexOf ( '?' ) >= 0 ) ? "&" : "?" ; // Append. url += joiner + attr + "=" + object [ attr ] ; } } } return url ; }
Handles binding the fields of an object into a URL.
@param {string} url The URL to bind against.
@param {object} val The object from which to draw properties.
@return {string} The updated URL.
Handles binding the fields of an object into a URL .