Using Pub/Sub pattern with Warden

Simple objects and ready modules

Warden is function that extends object with methods listen, unlisten, emit, stream.

var empty = Warden();
empty.listen('foo', function(event){
  console.log(event.message);
});

empty.emit({type: 'foo', message: 'Hello World!'});

// -> Hellow World!

When object is already exists.

var module = {prop: 'val'}

Warden(module); 
// now module has Warden methods

module.listen('foo', function(event){
  console.log(event.message);
  console.log(this.prop);
});

module.emit({type: 'foo', message: 'Hello World!'});

// -> Hellow World!
// -> val

With modules which already have Pub/Sub methods with addEventListener or on methods

Warden(document);
document.listen('click', function(){
  console.log('Hey! You clicked at me!');
});

//or 

With constructors

If your module implemented as class constructor:

var Mammal = Warden(function Mammal(name){
  this.name = name;
});

Mammal.prototype.say = function(){
  this.emit('say', {
    name: this.name
  });
}

var dog = new Mammal('Zorg');

//subscribing on event
dog.listen('say', function(e){
  console.log('Hello my name is ' + e.name);
});

dog.say();

// -> Hello my name is Zorg;