Source: lib/utility.js

/*jshint laxcomma:true, smarttabs: true, node: true, esnext: true */
'use strict';
/**
 * General helpers
 * @module tastypie/lib/util
 * @author Eric Satterwhite
 **/
var path = require( 'path' )
  , get  = require('mout/object/get')
  , startsWith = require('mout/string/startsWith')
  , toArray = require('mout/lang/toArray')
  , moduleExp = /(^[\.\/]+)?(([\w\\\/\-\_]+)?([\w]+))/g
  , noop = function(){}
  ;

/**
 * returns a node style callback if from a list of arguments
 * @param {...Object}  Arguments to generate a callback from
 * @return {Function}
 **/
exports.createCallback = function(...args){
    return typeof args[ args.length -1 ] === "function" ? args[ args.length-1 ] : noop;
};


/**
 * @param {String} string to a module or module member to resolve
 * @param {Boolean} [resolve] True to force path resoluation. by default, if the string starts with a dot, the path will be resolved
 * @example toModule('express/router.Router') // returns Router class from express router module
 * @example toModule('./packages/hive-stdlib/string.startWith') // returns startsWith function from string module with auth path resolution
 * @example toModule('test/module', true) // attempts to require module called test/module relative to the process's CWD
 */
exports.toModule = function( str, resolve ){
    var matches,mod;

    matches = str.match( moduleExp );

    mod = matches.shift();
    resolve = resolve == null ?  ( mod ).startsWith('.') ? true : false : !!resolve;
    mod = require( resolve ? path.resolve( mod ) : mod );
    return matches.length ? get( mod, matches.join('.') ) : mod;

}; 


exports.attempt = function( fn, args, scope ){
    try{
        return [ null, fn.apply( scope, toArray( args ) ) ];
    } catch( err ){
        return [ err, null ];
    }
};


exports.annotate = function annotate( err, bundle ){
    err.res = bundle.res;
    err.req = bundle.req;
    return err;
};