 	}
 
 
-	public func subscribe<T>(callback: (T) -> Void) -> Closure {
+	public func subscribe<Event>(for consumer: Consumer, callback: (Event) -> Void) {
+		consumer.subscribe(to: self, callback: callback)
+	}
+
+
+	public func subscribe<Event>(callback: (Event) -> Void) -> Closure {
 		return synchronized(lock) {
-			let scope = ObjectIdentifier(T.Type)
+			let scope = ObjectIdentifier(Event.Type)
 			let subscription = Subscription(callback: callback)
 
-			if let subscriptions = subscriptionsByScope[scope] as! Subscriptions<T>? {
+			if let subscriptions = subscriptionsByScope[scope] as! Subscriptions<Event>? {
 				subscriptions.list.append(subscription)
 			}
 			else {
-				let subscriptions = Subscriptions<T>()
+				let subscriptions = Subscriptions<Event>()
 				subscriptions.list.append(subscription)
 				subscriptionsByScope[scope] = subscriptions
 			}

						}
					}
				}
			}
		}
	}

					synchronized(self.lock) {
						subscription.callback = nil

						if let subscriptions = self.subscriptionsByScope[scope] as! Subscriptions<Event>? {
							subscriptions.list.removeFirstIdentical(subscription)

							if subscriptions.list.isEmpty {
