text: import {
    extendPrototype,
  } from '../functionExtensions';
  import DynamicPropertyContainer from '../helpers/dynamicProperties';
  import {
    initialDefaultFrame,
  } from '../../main';
  import shapeCollectionPool from '../pooling/shapeCollection_pool';
  
  const ShapeModifiers = (function () {
    var ob = {};
    var modifiers = {};
    ob.registerModifier = registerModifier;
    ob.getModifier = getModifier;
  
    function registerModifier(nm, factory) {
      if (!modifiers[nm]) {
        modifiers[nm] = factory;
      }
    }
  
    function getModifier(nm, elem, data) {
      return new modifiers[nm](elem, data);
    }
  
    return ob;
  }());
  
  function ShapeModifier() {}
  ShapeModifier.prototype.initModifierProperties = function () {};
  ShapeModifier.prototype.addShapeToModifier = function () {};
  ShapeModifier.prototype.addShape = function (data) {
    if (!this.closed) {
      // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick.
      data.sh.container.addDynamicProperty(data.sh);
      var shapeData = { shape: data.sh, data: data, localShapeCollection: shapeCollectionPool.newShapeCollection() };
      this.shapes.push(shapeData);
      this.addShapeToModifier(shapeData);
      if (this._isAnimated) {
        data.setAsAnimated();
      }
    }
  };
  ShapeModifier.prototype.init = function (elem, data) {
    this.shapes = [];
    this.elem = elem;
    this.initDynamicPropertyContainer(elem);
    this.initModifierProperties(elem, data);
    this.frameId = initialDefaultFrame;
    this.closed = false;
    this.k = false;
    if (this.dynamicProperties.length) {
      this.k = true;
    } else {
      this.getValue(true);
    }
  };
  ShapeModifier.prototype.processKeys = function () {
    if (this.elem.globalData.frameId === this.frameId) {
      return;
    }
    this.frameId = this.elem.globalData.frameId;
    this.iterateDynamicProperties();
  };
  
  extendPrototype([DynamicPropertyContainer], ShapeModifier);
  
  export {
    ShapeModifiers,
    ShapeModifier,
  };
  