'use strict'; import $ from 'jquery'; import { GetYoDigits } from './foundation.core.utils'; // Abstract class for providing lifecycle hooks. Expect plugins to define AT LEAST // {function} _setup (replaces previous constructor), // {function} _destroy (replaces previous destroy) class Plugin { constructor(element, options) { this._setup(element, options); var pluginName = getPluginName(this); this.uuid = GetYoDigits(6, pluginName); if(!this.$element.attr(`data-${pluginName}`)){ this.$element.attr(`data-${pluginName}`, this.uuid); } if(!this.$element.data('zfPlugin')){ this.$element.data('zfPlugin', this); } /** * Fires when the plugin has initialized. * @event Plugin#init */ this.$element.trigger(`init.zf.${pluginName}`); } destroy() { this._destroy(); var pluginName = getPluginName(this); this.$element.removeAttr(`data-${pluginName}`).removeData('zfPlugin') /** * Fires when the plugin has been destroyed. * @event Plugin#destroyed */ .trigger(`destroyed.zf.${pluginName}`); for(var prop in this){ this[prop] = null;//clean up script to prep for garbage collection. } } } // Convert PascalCase to kebab-case // Thank you: http://stackoverflow.com/a/8955580 function hyphenate(str) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } function getPluginName(obj) { if(typeof(obj.constructor.name) !== 'undefined') { return hyphenate(obj.constructor.name); } else { return hyphenate(obj.className); } } export {Plugin};