Pattern for creating a globally accessible custom plugin
The usual way to create a plugin is to declare a namespace or use an existing and append to it. Usually done using the module pattern:

(function(ns){

  //private scoping
  var privVar = '...';
  function priv(){...}

  //expose a function
  ns.myFunc = function(){...};

}(this.myLib = this.myLib || {}));

//using the exposed myFunc
myLib.myFunc();


Issues with your code? Well, it depended on jQuery just to append methods. It's not really necessary to use extend. With the above pattern, you can cleanly add functions to the namespace.

If you really need just some parts of jQuery, you can grab their code and just use it directly. I usually interrogate the code and pick out only the parts that are necessary. Or you can roll your own jQuery build. They have instructions on their GitHub on how to roll your own mix of jQuery.

Now, for function callbacks, you should use the a technique similar to pub-sub or event emitters or jQuery's on method. The syntax looks like this:

myLib.on('fnName',function(){...});


where fnName is the function name that is equivalent to the function called.

Now how to implement?

Well, each of your functions should call a special internal function that fires callbacks collected in your library. Basically, the on, method of your library just collects callbacks and registers them in an internal cache id'ed with the name of the function. The implementation would look like this:

(function(){

  //handler cache
  var handlers = {};

  //our internal function that executes handlers with a given name
  function executeHandlers(eventName){
    //get all handlers with the selected name
    var handler = handlers[eventName] || []
      , len = handler.length
      , i
      ;
    //execute each
    for(i = 0; i&lt; len; i++){
      //you can use apply to specify what "this" and parameters the callback gets
      handler[i].apply(this,[]);
    }
  }

  //our on function which collects handlers
  ns.on = function(eventName,handler){
    //if no handler collection exists, create one
    if(!handlers[eventName]){
      handlers[eventName] = [];
    }
    handlers[eventName].push(handler);
  }

  //so we expose a shout function
  ns.shout = function(){

    ...stuff shout does...

    //now we execute callbacks registered to shout
    executeHandlers('shout');
  }

}(this.myLib = this.myLib || {}));

//we register a callback
myLib.on('shout',function(){
  //executed after calling shout
});

//execute shout
myLib.shout();