const walkable = { walk(){ eventSender.emitEvent(events[0], { name: this.name, id: this.id, type: this.type }) }, } const sleepable = { sleep(){ eventSender.emitEvent(events[1] , { name: this.name, id: this.id, type: this.type }) } } const flyable = { fly(){ eventSender.emitEvent(events[2] , { name: this.name, id: this.id, type: this.type }) }, } const logable = { log(event, agent){ console.log(` event: ${event.name}; event_id: ${event.id}; agent: ${agent.name}; agent_id: ${agent.id}; agent_type: ${agent.type}; `) } } const Event = { findEvent(id){ return events[id] } } const Agent = { find(id){ return agents[id] }, } const eventSender = Object.assign({ emitEvent(event , agent){ this.log(event , agent) } }, logable); const Person = Object.assign({ find(id){ let agent = Agent.find(id) if(agent.type === 'person') return agent } }, walkable) const Dog = Object.assign({} , walkable, sleepable) const Cat = Object.assign({ find(id){ let agent = Agent.find(id); if(agent.type === 'cat') return agent } }, walkable, flyable, sleepable) const makePerson = function (obj = {}){ return Object.assign({ name: obj.name, id: obj.id, type: "person" }, Person, sleepable) } const makeCat = function(obj = {}){ return Object.assign({ name : obj.name, id : obj.id, type : "cat" }, Cat) } function makeDog(obj = {}){ return Object.assign({ name: obj.name, id: obj.id, type: "dog" }, Dog, flyable) } events = [ {id: 0, name: "walk"}, {id: 1, name: "sleep"}, {id: 1, name: "fly"}, ] agents = [ {id: 0, name: "Escureto", type: "cat"}, {id: 1, name: "Digous", type: 'cat'}, {id: 2, name: "Atila Silva", type: 'person'} ]