/*global define,Promise*/

/**
 * Module defining ImplementationLoader. Created by vwoeltje on 11/3/14.
 */
define(
    [],
    function () {
        "use strict";

        /**
         * Responsible for loading extension implementations
         * (AMD modules.) Acts as a wrapper around RequireJS to
         * provide a promise-like API.
         * @constructor
         * @param {*} require RequireJS, or an object with similar API
         * @param {*} $log Angular's logging service
         */
        function ImplementationLoader(require) {
            function loadModule(path) {
                return new Promise(function (fulfill, reject) {
                    require([path], fulfill, reject);
                });
            }

            return {
                /**
                 * Load an extension's implementation; or, equivalently,
                 * load an AMD module. This is fundamentally similar
                 * to a call to RequireJS, except that the result is
                 * wrapped in a promise. The promise will be fulfilled
                 * with the loaded module, or rejected with the error
                 * reported by Require.
                 *
                 * @method
                 * @memberof ImplementationLoader#
                 * @param {string} path the path to the module to load
                 * @returns {Promise} a promise for the specified module.
                 */
                load: loadModule
            };
        }

        return ImplementationLoader;
    }
);