@surface/core
Version:
Provides core functionality of many @surfaces modules.
31 lines (30 loc) • 1.09 kB
JavaScript
import HookableMetadata from "./metadata/hookable-metadata.js";
export default class Hookable {
constructor() {
HookableMetadata.from(this.constructor).initialize(this);
}
static as(base) {
return class HookableExtends extends base {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
constructor(...args) {
super(...args);
HookableMetadata.from(this.constructor).initialize(this);
}
};
}
static finisher(target) {
const metadata = HookableMetadata.from(target);
if (!metadata.hooked) {
metadata.hooked = true;
const handler = {
construct: (target, args, newTarget) => {
const instance = Reflect.construct(target, args, newTarget);
HookableMetadata.from(target).finish(instance);
return instance;
},
};
return new Proxy(target, handler);
}
return target;
}
}