whole_func_string: function createInterimElementProvider(interimFactoryName) {
      factory.$inject = ["$$interimElement", "$injector"];
      var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];
  
      var customMethods = {};
      var providerConfig = {
        presets: {}
      };
  
      var provider = {
        setDefaults: setDefaults,
        addPreset: addPreset,
        addMethod: addMethod,
        $get: factory
      };
  
      /**
       * all interim elements will come with the 'build' preset
       */
      provider.addPreset('build', {
        methods: ['controller', 'controllerAs', 'resolve', 'multiple',
          'template', 'templateUrl', 'themable', 'transformTemplate', 'parent', 'contentElement']
      });
  
      return provider;
  
      /**
       * Save the configured defaults to be used when the factory is instantiated
       */
      function setDefaults(definition) {
        providerConfig.optionsFactory = definition.options;
        providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);
        return provider;
      }
  
      /**
       * Add a method to the factory that isn't specific to any interim element operations
       */
  
      function addMethod(name, fn) {
        customMethods[name] = fn;
        return provider;
      }
  
      /**
       * Save the configured preset to be used when the factory is instantiated
       */
      function addPreset(name, definition) {
        definition = definition || {};
        definition.methods = definition.methods || [];
        definition.options = definition.options || function() { return {}; };
  
        if (/^cancel|hide|show$/.test(name)) {
          throw new Error("Preset '" + name + "' in " + interimFactoryName + " is reserved!");
        }
        if (definition.methods.indexOf('_options') > -1) {
          throw new Error("Method '_options' in " + interimFactoryName + " is reserved!");
        }
        providerConfig.presets[name] = {
          methods: definition.methods.concat(EXPOSED_METHODS),
          optionsFactory: definition.options,
          argOption: definition.argOption
        };
        return provider;
      }
  
      function addPresetMethod(presetName, methodName, method) {
        providerConfig.presets[presetName][methodName] = method;
      }
  
      /**
       * Create a factory that has the given methods & defaults implementing interimElement
       */
      /* @ngInject */
      function factory($$interimElement, $injector) {
        var defaultMethods;
        var defaultOptions;
        var interimElementService = $$interimElement();
  
        /*
         * publicService is what the developer will be using.
         * It has methods hide(), cancel(), show(), build(), and any other
         * presets which were set during the config phase.
         */
        var publicService = {
          hide: interimElementService.hide,
          cancel: interimElementService.cancel,
          show: showInterimElement,
  
          // Special internal method to destroy an interim element without animations
          // used when navigation changes causes a $scope.$destroy() action
          destroy : destroyInterimElement
        };
  
  
        defaultMethods = providerConfig.methods || [];
        // This must be invoked after the publicService is initialized
        defaultOptions = invokeFactory(providerConfig.optionsFactory, {});
  
        // Copy over the simple custom methods
        angular.forEach(customMethods, function(fn, name) {
          publicService[name] = fn;
        });
  
        angular.forEach(providerConfig.presets, function(definition, name) {
          var presetDefaults = invokeFactory(definition.optionsFactory, {});
          var presetMethods = (definition.methods || []).concat(defaultMethods);
  
          // Every interimElement built with a preset has a field called `$type`,
          // which matches the name of the preset.
          // Eg in preset 'confirm', options.$type === 'confirm'
          angular.extend(presetDefaults, { $type: name });
  
          // This creates a preset class which has setter methods for every
          // method given in the `.addPreset()` function, as well as every
          // method given in the `.setDefaults()` function.
          //
          // @example
          // .setDefaults({
          //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],
          //   options: dialogDefaultOptions
          // })
          // .addPreset('alert', {
          //   methods: ['title', 'ok'],
          //   options: alertDialogOptions
          // })
          //
          // Set values will be passed to the options when interimElement.show() is called.
          function Preset(opts) {
            this._options = angular.extend({}, presetDefaults, opts);
          }
          angular.forEach(presetMethods, function(name) {
            Preset.prototype[name] = function(value) {
              this._options[name] = value;
              return this;
            };
          });
  
          // Create shortcut method for one-linear methods
          if (definition.argOption) {
            var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);
            publicService[methodName] = function(arg) {
              var config = publicService[name](arg);
              return publicService.show(config);
            };
          }
  
          // eg $mdDialog.alert() will return a new alert preset
          publicService[name] = function(arg) {
            // If argOption is supplied, eg `argOption: 'content'`, then we assume
            // if the argument is not an options object then it is the `argOption` option.
            //
            // @example `$mdToast.simple('hello')` // sets options.content to hello
            //                                     // because argOption === 'content'
            if (arguments.length && definition.argOption &&
                !angular.isObject(arg) && !angular.isArray(arg))  {
  
              return (new Preset())[definition.argOption](arg);
  
            } else {
              return new Preset(arg);
            }
  
          };
        });
  
        return publicService;
  
        /**
         *
         */
        function showInterimElement(opts) {
          // opts is either a preset which stores its options on an _options field,
          // or just an object made up of options
          opts = opts || { };
          if (opts._options) opts = opts._options;
  
          return interimElementService.show(
            angular.extend({}, defaultOptions, opts)
          );
        }
  
        /**
         *  Special method to hide and destroy an interimElement WITHOUT
         *  any 'leave` or hide animations ( an immediate force hide/remove )
         *
         *  NOTE: This calls the onRemove() subclass method for each component...
         *  which must have code to respond to `options.$destroy == true`
         */
        function destroyInterimElement(opts) {
            return interimElementService.destroy(opts);
        }
  
        /**
         * Helper to call $injector.invoke with a local of the factory name for
         * this provider.
         * If an $mdDialog is providing options for a dialog and tries to inject
         * $mdDialog, a circular dependency error will happen.
         * We get around that by manually injecting $mdDialog as a local.
         */
        function invokeFactory(factory, defaultVal) {
          var locals = {};
          locals[interimFactoryName] = publicService;
          return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);
        }
  
      }
  
    }
func_code_string: function createInterimElementProvider(interimFactoryName) {
      factory.$inject = ["$$interimElement", "$injector"];
      var EXPOSED_METHODS = ['onHide', 'onShow', 'onRemove'];
  
      var customMethods = {};
      var providerConfig = {
        presets: {}
      };
  
      var provider = {
        setDefaults: setDefaults,
        addPreset: addPreset,
        addMethod: addMethod,
        $get: factory
      };
  
      /**
       * all interim elements will come with the 'build' preset
       */
      provider.addPreset('build', {
        methods: ['controller', 'controllerAs', 'resolve', 'multiple',
          'template', 'templateUrl', 'themable', 'transformTemplate', 'parent', 'contentElement']
      });
  
      return provider;
  
      /**
       * Save the configured defaults to be used when the factory is instantiated
       */
      function setDefaults(definition) {
        providerConfig.optionsFactory = definition.options;
        providerConfig.methods = (definition.methods || []).concat(EXPOSED_METHODS);
        return provider;
      }
  
      /**
       * Add a method to the factory that isn't specific to any interim element operations
       */
  
      function addMethod(name, fn) {
        customMethods[name] = fn;
        return provider;
      }
  
      /**
       * Save the configured preset to be used when the factory is instantiated
       */
      function addPreset(name, definition) {
        definition = definition || {};
        definition.methods = definition.methods || [];
        definition.options = definition.options || function() { return {}; };
  
        if (/^cancel|hide|show$/.test(name)) {
          throw new Error("Preset '" + name + "' in " + interimFactoryName + " is reserved!");
        }
        if (definition.methods.indexOf('_options') > -1) {
          throw new Error("Method '_options' in " + interimFactoryName + " is reserved!");
        }
        providerConfig.presets[name] = {
          methods: definition.methods.concat(EXPOSED_METHODS),
          optionsFactory: definition.options,
          argOption: definition.argOption
        };
        return provider;
      }
  
      function addPresetMethod(presetName, methodName, method) {
        providerConfig.presets[presetName][methodName] = method;
      }
  
      /**
       * Create a factory that has the given methods & defaults implementing interimElement
       */
      /* @ngInject */
      function factory($$interimElement, $injector) {
        var defaultMethods;
        var defaultOptions;
        var interimElementService = $$interimElement();
  
        /*
         * publicService is what the developer will be using.
         * It has methods hide(), cancel(), show(), build(), and any other
         * presets which were set during the config phase.
         */
        var publicService = {
          hide: interimElementService.hide,
          cancel: interimElementService.cancel,
          show: showInterimElement,
  
          // Special internal method to destroy an interim element without animations
          // used when navigation changes causes a $scope.$destroy() action
          destroy : destroyInterimElement
        };
  
  
        defaultMethods = providerConfig.methods || [];
        // This must be invoked after the publicService is initialized
        defaultOptions = invokeFactory(providerConfig.optionsFactory, {});
  
        // Copy over the simple custom methods
        angular.forEach(customMethods, function(fn, name) {
          publicService[name] = fn;
        });
  
        angular.forEach(providerConfig.presets, function(definition, name) {
          var presetDefaults = invokeFactory(definition.optionsFactory, {});
          var presetMethods = (definition.methods || []).concat(defaultMethods);
  
          // Every interimElement built with a preset has a field called `$type`,
          // which matches the name of the preset.
          // Eg in preset 'confirm', options.$type === 'confirm'
          angular.extend(presetDefaults, { $type: name });
  
          // This creates a preset class which has setter methods for every
          // method given in the `.addPreset()` function, as well as every
          // method given in the `.setDefaults()` function.
          //
          // @example
          // .setDefaults({
          //   methods: ['hasBackdrop', 'clickOutsideToClose', 'escapeToClose', 'targetEvent'],
          //   options: dialogDefaultOptions
          // })
          // .addPreset('alert', {
          //   methods: ['title', 'ok'],
          //   options: alertDialogOptions
          // })
          //
          // Set values will be passed to the options when interimElement.show() is called.
          function Preset(opts) {
            this._options = angular.extend({}, presetDefaults, opts);
          }
          angular.forEach(presetMethods, function(name) {
            Preset.prototype[name] = function(value) {
              this._options[name] = value;
              return this;
            };
          });
  
          // Create shortcut method for one-linear methods
          if (definition.argOption) {
            var methodName = 'show' + name.charAt(0).toUpperCase() + name.slice(1);
            publicService[methodName] = function(arg) {
              var config = publicService[name](arg);
              return publicService.show(config);
            };
          }
  
          // eg $mdDialog.alert() will return a new alert preset
          publicService[name] = function(arg) {
            // If argOption is supplied, eg `argOption: 'content'`, then we assume
            // if the argument is not an options object then it is the `argOption` option.
            //
            // @example `$mdToast.simple('hello')` // sets options.content to hello
            //                                     // because argOption === 'content'
            if (arguments.length && definition.argOption &&
                !angular.isObject(arg) && !angular.isArray(arg))  {
  
              return (new Preset())[definition.argOption](arg);
  
            } else {
              return new Preset(arg);
            }
  
          };
        });
  
        return publicService;
  
        /**
         *
         */
        function showInterimElement(opts) {
          // opts is either a preset which stores its options on an _options field,
          // or just an object made up of options
          opts = opts || { };
          if (opts._options) opts = opts._options;
  
          return interimElementService.show(
            angular.extend({}, defaultOptions, opts)
          );
        }
  
        /**
         *  Special method to hide and destroy an interimElement WITHOUT
         *  any 'leave` or hide animations ( an immediate force hide/remove )
         *
         *  NOTE: This calls the onRemove() subclass method for each component...
         *  which must have code to respond to `options.$destroy == true`
         */
        function destroyInterimElement(opts) {
            return interimElementService.destroy(opts);
        }
  
        /**
         * Helper to call $injector.invoke with a local of the factory name for
         * this provider.
         * If an $mdDialog is providing options for a dialog and tries to inject
         * $mdDialog, a circular dependency error will happen.
         * We get around that by manually injecting $mdDialog as a local.
         */
        function invokeFactory(factory, defaultVal) {
          var locals = {};
          locals[interimFactoryName] = publicService;
          return $injector.invoke(factory || function() { return defaultVal; }, {}, locals);
        }
  
      }
  
    }
func_documentation_string: Returns a new provider which allows configuration of a new interimElement
  service. Allows configuration of default options & methods for options,
  as well as configuration of 'preset' methods (eg dialog.basic(): basic is a preset method)