plugins[$plugin->getMethod()] = $plugin; return $this; } /** * Find a specific plugin. * * @param string $method * * @throws PluginNotFoundException * * @return PluginInterface */ protected function findPlugin($method) { if ( ! isset($this->plugins[$method])) { throw new PluginNotFoundException('Plugin not found for method: ' . $method); } return $this->plugins[$method]; } /** * Invoke a plugin by method name. * * @param string $method * @param array $arguments * @param FilesystemInterface $filesystem * * @throws PluginNotFoundException * * @return mixed */ protected function invokePlugin($method, array $arguments, FilesystemInterface $filesystem) { $plugin = $this->findPlugin($method); $plugin->setFilesystem($filesystem); $callback = [$plugin, 'handle']; return call_user_func_array($callback, $arguments); } /** * Plugins pass-through. * * @param string $method * @param array $arguments * * @throws BadMethodCallException * * @return mixed */ public function __call($method, array $arguments) { try { return $this->invokePlugin($method, $arguments, $this); } catch (PluginNotFoundException $e) { throw new BadMethodCallException( 'Call to undefined method ' . get_class($this) . '::' . $method ); } } }