// A class factory that takes its base and settings as one options object, // as Effect's makeClass does: `makeClass({ Base, name })` destructures them // and builds `class extends Base`. function makeClass({ Base, name, tag: label }) { return class extends Base { constructor(value) { super(value); this.kind = name; this.label = label; } describe() { return `${this.label}:${this.kind}:${this.value}`; } // Each class passes itself back as a base: a call site must not // specialize makeClass on the classes makeClass itself defines. static extend(name) { return makeClass({ Base: this, name, tag: label }); } }; } class Root { constructor(value) { this.value = value; } } export function Class(name) { return makeClass({ Base: Root, name, tag: "root" }); } export function extend(Base, name) { return makeClass({ Base, name, tag: "sub" }); }