@surface/core
Version:
Provides core functionality of many @surfaces modules.
28 lines (27 loc) • 1.12 kB
JavaScript
const HOOKABLE_METADATA = Symbol("core:hookable-metadata");
export default class HookableMetadata {
finishers = [];
initializers = [];
hooked = false;
static from(target) {
if (!Reflect.has(target, HOOKABLE_METADATA)) {
Reflect.defineProperty(target, HOOKABLE_METADATA, { configurable: false, enumerable: false, value: new HookableMetadata() });
}
else if (!target.hasOwnProperty(HOOKABLE_METADATA)) {
Reflect.defineProperty(target, HOOKABLE_METADATA, { configurable: false, enumerable: false, value: Reflect.get(target, HOOKABLE_METADATA).clone() });
}
return Reflect.get(target, HOOKABLE_METADATA);
}
clone() {
const metadata = new HookableMetadata();
metadata.finishers.push(...this.finishers);
metadata.initializers.push(...this.initializers);
return metadata;
}
finish(instance) {
this.finishers.forEach(finisher => finisher(instance));
}
initialize(instance) {
this.initializers.forEach(initializer => initializer(instance));
}
}