3 var forEach = require('es5-ext/object/for-each')
4 , validValue = require('es5-ext/object/valid-object')
6 , push = Array.prototype.apply, defineProperty = Object.defineProperty
7 , create = Object.create, hasOwnProperty = Object.prototype.hasOwnProperty
8 , d = { configurable: true, enumerable: false, writable: true };
10 module.exports = function (e1, e2) {
12 (validValue(e1) && validValue(e2));
13 if (!hasOwnProperty.call(e1, '__ee__')) {
14 if (!hasOwnProperty.call(e2, '__ee__')) {
15 d.value = create(null);
16 defineProperty(e1, '__ee__', d);
17 defineProperty(e2, '__ee__', d);
22 defineProperty(e1, '__ee__', d);
26 data = d.value = e1.__ee__;
27 if (!hasOwnProperty.call(e2, '__ee__')) {
28 defineProperty(e2, '__ee__', d);
32 if (data === e2.__ee__) return;
33 forEach(e2.__ee__, function (listener, name) {
35 data[name] = listener;
38 if (typeof data[name] === 'object') {
39 if (typeof listener === 'object') push.apply(data[name], listener);
40 else data[name].push(listener);
41 } else if (typeof listener === 'object') {
42 listener.unshift(data[name]);
43 data[name] = listener;
45 data[name] = [data[name], listener];
48 defineProperty(e2, '__ee__', d);