public static function isInstalled()
 {
     if (!self::isExtensionDriverReady()) {
         return false;
     }
     $pluginManager = Artificer::pluginManager();
     $widgetManager = Artificer::widgetManager();
     foreach (Artificer::getCoreExtensions() as $coreExtension) {
         if (!$pluginManager->isInstalled($coreExtension) && !$widgetManager->isInstalled($coreExtension)) {
             return false;
         }
     }
     return true;
 }
 protected function installCoreExtensions()
 {
     $pluginManager = Artificer::pluginManager();
     $widgetManager = Artificer::widgetManager();
     // Enable install events
     Artificer::pluginManager()->boot();
     Artificer::widgetManager()->boot();
     foreach (Artificer::getCoreExtensions() as $coreExtension) {
         if (!$pluginManager->isInstalled($coreExtension) && !$widgetManager->isInstalled($coreExtension)) {
             // Todo: know if its plugin or widget
             $installed = $pluginManager->installer()->install($coreExtension);
             if (!$installed) {
                 throw new \Exception("Unable to install Artificer core extension {$coreExtension}");
             }
         }
     }
 }
 /**
  * Bootstrap the application events.
  *
  * @return void
  */
 public function boot()
 {
     if (!$this->isBootable) {
         return;
     }
     $this->addPublishableFiles();
     // Wait until app is ready for config to be published
     if (!$this->isPublished()) {
         return;
     }
     $this->addMiddleware();
     $this->providers(config('admin.providers'));
     $this->aliases(config('admin.aliases'));
     $this->commands(config('admin.commands'));
     Artificer::assetManager()->add(config('admin.assets', []));
     $this->loadViewsFrom(__DIR__ . '/../resources/views/', 'artificer');
     if (InstallServiceProvider::isExtensionDriverReady()) {
         Artificer::pluginManager()->boot();
         Artificer::widgetManager()->boot();
     }
     if (!$this->app->routesAreCached()) {
         require_once __DIR__ . '/../routes/admin.php';
     }
 }
    Route::group(['middleware' => 'artificer-installed', 'prefix' => 'install'], function () {
        Route::get('/', ['as' => 'admin.install', 'uses' => InstallController::class . '@home']);
        Route::post('/', InstallController::class . '@install');
    });
    \Mascame\Artificer\Artificer::pluginManager()->outputCoreRoutes();
    Route::group(['middleware' => ['artificer-auth']], function () {
        Route::get('/', ['as' => 'admin.home', 'uses' => HomeController::class . '@home']);
        Route::get('extensions', ExtensionController::class . '@extensions')->name('admin.extensions');
        foreach (['plugins', 'widgets'] as $extensionType) {
            Route::group(['prefix' => $extensionType], function () use($extensionType) {
                Route::get('{slug}/install', ExtensionController::class . '@install')->name('admin.' . $extensionType . '.install');
                Route::get('{slug}/uninstall', ExtensionController::class . '@uninstall')->name('admin.' . $extensionType . '.uninstall');
            });
        }
        Route::group(['prefix' => 'model'], function () {
            Route::get('{slug}', ModelController::class . '@all')->name('admin.model.all');
            Route::get('{slug}/filter', ModelController::class . '@filter')->name('admin.model.filter');
            Route::get('{slug}/create', ModelController::class . '@create')->name('admin.model.create');
            Route::get('{slug}/{id}', ModelController::class . '@show')->name('admin.model.show');
            Route::get('{slug}/{id}/edit', ModelController::class . '@edit')->name('admin.model.edit');
            Route::get('{slug}/{id}/edit/{field}', ModelController::class . '@field')->name('admin.model.field.edit');
            Route::post('{slug}/store', ModelController::class . '@updateOrCreate')->name('admin.model.store');
            Route::put('{slug}/{id}', ModelController::class . '@updateOrCreate')->name('admin.model.update');
            Route::delete('{slug}/{id}', ModelController::class . '@destroy')->name('admin.model.destroy');
            Route::get('{slug}/{id}/field/{name}', ModelController::class . '@getRelatedFieldOutput')->name('admin.model.field');
        });
        Route::group(['prefix' => 'plugin'], function () {
            \Mascame\Artificer\Artificer::pluginManager()->outputRoutes();
        });
    });
});
 /**
  * @param array|string $plugin
  * @return bool
  */
 protected function addPlugin($plugin)
 {
     return Artificer::pluginManager()->add($this->package, $plugin);
 }
 public function extensions()
 {
     return View::make($this->getView('extensions'))->with('packages', Artificer::pluginManager()->getPackages());
 }