# Events Module Much of the Node.js core API is built around an idiomatic *asynchronous event-driven architecture* in which certain kinds of objects (**emitters**) emit *named events* that cause `Function` objects (**listeners**) to be called. All objects that emit events are instances of the `EventEmitter` class. These objects expose an `eventEmitter.on()` function that allows one or more functions to be attached to named events emitted by the object. Typically, event names are camel-cased strings but any valid JavaScript property key can be used. When the EventEmitter object emits an event, all of the functions attached to that specific event are called *synchronously*. Any values returned by the called listeners are *ignored and discarded*. ```js const EventEmitter = require("events"); class CustomEmitter extends EventEmitter {} ; const customEmitterObj = new CustomEmitter(); // add event listener cusomEmitterObj.on("event", (e) => { // e contains event object }) // single-use event listener (execute and remove listener) cusomEmitterObj.once("event", (e) => { // e contains event object }) customEmitterObj.removeListener("event", callback); customEmitterObj.removeAllListeners("event"); customEmitterObj.emit("event"); customEmitterObj.emit("event", { /* event object */ }); customEmitterObj.eventNames(); // string[] of the events it listens to customEmitterObj.listenerCount("event"); // num of listeners for an event customEmitterObj.listeners(); // Function[], handlers of the events ```