Access To Private Methods For Testing Purposes
// '__TPM' could be also conditionally defined with say:  
// if (/staging|development/g.test(document.domain) )
// or a querystring '&debug=1'  param etc.

if (typeof Function.prototype.__TPM === "undefined") {
    Function.prototype.__TPM = function(privScope, bindToScope, func, args) {
        return privScope[func].apply(bindToScope, args);
    };
}
  
var PublicModule = 
  (function() { 
      var publicAPI, 
          _t = this, 
          __TPM = Function.prototype.__TPM; //'TestPrivateMethods'


      _t._privFunc = function(sIn)  {
          return _t.privFunc2('dlroW' + sIn);
      };
      
      _t.privFunc2 = function(sIn) {
          if (!sIn) {
              return;
          }
          return sIn.split("").reverse().join("");
      };
      
      // Now the public methods
    publicAPI = {
        publicFunc: function() {
            return 'hello';
        },

        //second public method (NOTE this one relies on a private method)
        publicFunc2: function(sIn) {
          return _t._privFunc(sIn);
        }
      };
      if (__TPM) {
          publicAPI.__TPM = function(sFuncName) {
              return __TPM(_t, publicAPI, sFuncName, Array.prototype.slice.call(arguments, 1));
          };
      }

     return publicAPI;
  }), 
  PublicModule = PublicModule.call(PublicModule);



    equal(PublicModule.publicFunc(), "hello");
    equal(PublicModule.publicFunc2(" ,Olleh"), "hellO, World");
    equal(typeof PublicModule._privFunc, "undefined"); // Private method is inaccessble to outside world so expect undefined.
    

    var mocked_privFunc = { 
        _privFunc: function(sIn) { 
            return PublicModule.__TPM("_privFunc", sIn).toUpperCase();
        }
    };
    equal(Function.prototype.__TPM(mocked_privFunc, {}, "_privFunc", ["yensiD"]), "DISNEYWORLD");