import{getUid}from"./util.js";import ObjectEventType from"./ObjectEventType.js";import Observable from"./Observable.js";import Event from"./events/Event.js";import{assign}from"./obj.js";class ObjectEvent extends Event{constructor(e,t,s){super(e),this.key=t,this.oldValue=s}}class BaseObject extends Observable{constructor(e){super(),getUid(this),this.values_={},void 0!==e&&this.setProperties(e)}get(e){let t;return t=this.values_.hasOwnProperty(e)?this.values_[e]:t}getKeys(){return Object.keys(this.values_)}getProperties(){return assign({},this.values_)}notify(e,t){var s=getChangeEventType(e);this.dispatchEvent(new ObjectEvent(s,e,t)),s=ObjectEventType.PROPERTYCHANGE,this.dispatchEvent(new ObjectEvent(s,e,t))}set(e,t,s){s?this.values_[e]=t:(s=this.values_[e])!==(this.values_[e]=t)&&this.notify(e,s)}setProperties(e,t){for(const s in e)this.set(s,e[s],t)}unset(e,t){var s;e in this.values_&&(s=this.values_[e],delete this.values_[e],t||this.notify(e,s))}}const changeEventTypeCache={};function getChangeEventType(e){return changeEventTypeCache.hasOwnProperty(e)?changeEventTypeCache[e]:changeEventTypeCache[e]="change:"+e}export default BaseObject;export{ObjectEvent,getChangeEventType};