goog.provide('M.Plugin'); goog.provide('M.plugin'); goog.require('M.facade.Base'); (function () { /** * @namespace * @api stable */ M.plugin = {}; /** * @classdesc * Main facade plugin object. This class creates a plugin * object which has an implementation Object * * @constructor * @extends {M.facade.Base} * @param {Object} impl implementation object * @api stable */ M.Plugin = (function (impl) { goog.base(this, impl); }); goog.inherits(M.Plugin, M.facade.Base); /** * This function provides the implementation * of the object * * @public * @function * @param {Object} map the map to add the plugin * @api stable */ M.Plugin.prototype.addTo = function (map) { var this_; // checks if the parameter is null or empty if (M.utils.isNullOrEmpty(map)) { M.exception('No ha especificado ningún mapa'); } // checks if the implementation can add itself into the map var impl = this.getImpl(); if (M.utils.isUndefined(impl.addTo)) { M.exception('La implementación usada no posee el método addTo'); } var view = this.createView(map); // checks if the view is a promise if (view instanceof Promise) { this_ = this; view.then(function (html) { impl.addTo(map, html); // executes load callback this_.fire(M.evt.ADDED_TO_MAP); }); } else { // view is an HTML or text impl.addTo(map, view); // executes load callback this.fire(M.evt.ADDED_TO_MAP); } }; /** * This function creates the HTML view for this control * @public * @function * @param {M.Map} map to add the plugin * @api stable */ M.Plugin.prototype.createView = function (map) {}; })();