jQuery.newPlugin = function(pluginName, plugin, defaults, singleton) {
  var $ = jQuery
  $.fn[pluginName] = function(options) {
		options = parseArgs(arguments, defaults)
    options = $.extend(true, {}, $.fn[pluginName].defaults, options)
    if ($.metadata) options = $.extend(true, {}, options, $this.metadata())

    return this.each(function() {
			this.log = ("console" in window) && options.debug ? log : $.noop
      var $this = $(this)
			if (singleton) {
      	if ($this.data(pluginName)) return
	      $this.data(pluginName, plugin)
			}
      plugin.call(this, options)
    })
  }
  $.fn[pluginName].defaults = defaults || {}

	function log(msg) {
		console.log(pluginName+":", msg)
	}

	function parseArgs(args, defaults) {
		if ( args.length == 0 ) return {}
		if ( args.length == 1 && $.isPlainObject(args[0]) ) return args[0]
		var last = null
		if ( $.isPlainObject(args[args.length-1]) ) {
			last = args[args.length-1]
			delete args[args.length-1]
		}
		var keys = []
		for (var k in defaults)	keys.push(k)

		var opt = {}
		for (var i = 0; i < args.length && i < keys.length; i++)
			opt[keys[i]] = args[i]

		if (last !== null) opt = $.extend(true, {}, last, opt)
		return opt
	}
}

