import { Assignable, Serializable } from './interfaces'; export abstract class Persistent implements Assignable, Serializable { private _data: Record = {}; protected readonly properties: Record = {}; public assign (a: Assignable): void { this.assign_object (a.to_object ()); } public assign_to (a: Assignable): void { a.assign (this); } public assign_object (obj: Record): void { for (const key of Object.keys (obj)) { const prop = this.properties[key]; if (typeof prop !== 'undefined' && typeof obj[key] === prop) this._data[key] = obj[key]; } } public to_object (): Record { return this._data; } public serialize (formatted = false): string { if (formatted) return JSON.stringify (this.to_object ()); return JSON.stringify (this.to_object (), null, 2); } public set (key: string, value: unknown): void { const prop = this.properties[key]; if (typeof prop !== 'undefined' && typeof value === prop) this._data[key] = value; } public get (key: string): unknown { return this._data[key]; } }