src/pluggable.js
function( app ) {
	this.app = app;
	this.loaded = false;
	this.preloadThreshold = 3000;
	this.plugins = {};
	this.modifications = {};
	this.customTests = [];

	// Allow plugins 1500 ms to register before we start polling their
	setTimeout( this._pollLoadingPlugins.bind( this ), 1500 );
}
function( app ) {
	this.app = app;
	this.loaded = false;
	this.preloadThreshold = 3000;
	this.plugins = {};
	this.modifications = {};
	this.customTests = [];

	// Allow plugins 1500 ms to register before we start polling their
	setTimeout( this._pollLoadingPlugins.bind( this ), 1500 );
}
The plugins object takes care of plugin registrations, preloading and managing data modifications.

A plugin for YoastSEO.js is basically a piece of JavaScript that hooks into YoastSEO.js by registering modifications.
In order to do so, it must first register itself as a plugin with YoastSEO.js. To keep our content analysis fast, we
don't allow asynchronous modifications. That's why we require plugins to preload all data they need in order to modify
the content. If plugins need to preload data, they can first register, then preload using AJAX and call `ready` once
preloaded.

To minimize client side memory usage, we request plugins to preload as little data as possible. If you need to dynamically
fetch more data in the process of content creation, you can reload your data set and let YoastSEO.js know you've reloaded
by calling `reloaded`.
 
Setup Pluggable and set its default values.

@constructor
@param       {App}       app                 The App object to attach to.
@property    {number}    preloadThreshold	The maximum time plugins are allowed to preload before we load our content analysis.
@property    {object}    plugins             The plugins that have been registered.
@property    {object}    modifications 	    The modifications that have been registered. Every modification contains an array with callables.
@property    {Array}     customTests         All tests added by plugins.