<?php
/**
 * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 * @link          https://cakephp.org CakePHP(tm) Project
 * @since         3.6.0
 * @license       https://opensource.org/licenses/mit-license.php MIT License
 */
namespace Cake\Core;

/**
 * Interface for Applications that leverage plugins
 */
interface PluginApplicationInterface
{
    /**
     * Add a plugin to the loaded plugin set.
     *
     * @param string|\Cake\Core\PluginInterface $name The plugin name or plugin object.
     * @param array $config The configuration data for the plugin if using a string for $name
     * @return $this
     */
    public function addPlugin($name, array $config = []);

    /**
     * Run bootstrap logic for loaded plugins
     *
     * @return void
     */
    public function pluginBootstrap();

    /**
     * Run routes hooks for loaded plugins
     *
     * @param \Cake\Routing\RouteBuilder $routes The route builder to use.
     * @return \Cake\Routing\RouteBuilder
     */
    public function pluginRoutes($routes);

    /**
     * Run middleware hooks for plugins
     *
     * @param \Cake\Http\MiddlewareStack $middleware The MiddlewareStack to use.
     * @return \Cake\Http\MiddlewareStack
     */
    public function pluginMiddleware($middleware);

    /**
     * Run console hooks for plugins
     *
     * @param \Cake\Console\CommandCollection $commands The CommandCollection to use.
     * @return \Cake\Console\CommandCollection
     */
    public function pluginConsole($commands);
}

Add interface for applications using plugins
Add interface for applications using plugins

Adding another interface will let applications not use plugins if they
don't want to, and also customize how their plugin hooks are implemented
if they really need to.
