define [], () ->
	class EventEmitter
		on: (event, callback) ->
			@events ||= {}
			[event, namespace] = event.split(".")
			@events[event] ||= []
			@events[event].push {
				callback: callback
				namespace: namespace
			}

		off: (event) ->
			@events ||= {}
			if event?
				[event, namespace] = event.split(".")
				if !namespace?
					# Clear all listeners for event
					delete @events[event]
				else
					# Clear only namespaced listeners
					remaining_events = []
					for callback in @events[event] or []
						if callback.namespace != namespace
							remaining_events.push callback
					@events[event] = remaining_events
			else
				# Remove all listeners
				@events = {}

		trigger: (event, args...) ->
			@events ||= {}
			for callback in @events[event] or []
				callback.callback(args...)

		emit: (args...) -> @trigger(args...)