diff --git a/framework/core/src/Frontend/Content/Assets.php b/framework/core/src/Frontend/Content/Assets.php
index b9b31f769..7a7c2bf86 100644
--- a/framework/core/src/Frontend/Content/Assets.php
+++ b/framework/core/src/Frontend/Content/Assets.php
@@ -18,7 +18,14 @@ use Psr\Http\Message\ServerRequestInterface as Request;
 
 class Assets
 {
+    /**
+     * @var Container
+     */
     protected $container;
+
+    /**
+     * @var Config
+     */
     protected $config;
 
     /**
@@ -32,26 +39,56 @@ class Assets
         $this->config = $config;
     }
 
-    public function forFrontend(string $name)
+    /**
+     * Sets the frontend to generate assets for.
+     *
+     * @param string $name frontend name
+     * @return $this
+     * @throws \Illuminate\Contracts\Container\BindingResolutionException
+     */
+    public function forFrontend(string $name): Assets
     {
         $this->assets = $this->container->make('flarum.assets.'.$name);
 
         return $this;
     }
 
-    public function __invoke(Document $document, Request $request)
+    public function __invoke(Document $document, Request $request): void
     {
         $locale = $request->getAttribute('locale');
 
-        $compilers = [
-            'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
-            'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
-        ];
+        $compilers = $this->assembleCompilers($locale);
 
         if ($this->config->inDebugMode()) {
             $this->forceCommit(Arr::flatten($compilers));
         }
 
+        $this->addAssetsToDocument($document, $compilers);
+    }
+
+    /**
+     * Assembles JS and CSS compilers to be used to generate frontend assets.
+     *
+     * @param string|null $locale
+     * @return array[]
+     */
+    protected function assembleCompilers(?string $locale): array
+    {
+        return [
+            'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
+            'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
+        ];
+    }
+
+    /**
+     * Adds URLs of frontend JS and CSS to the {@link Document} class.
+     *
+     * @param Document $document
+     * @param array $compilers
+     * @return void
+     */
+    protected function addAssetsToDocument(Document $document, array $compilers): void
+    {
         $document->js = array_merge($document->js, $this->getUrls($compilers['js']));
         $document->css = array_merge($document->css, $this->getUrls($compilers['css']));
     }
@@ -61,7 +98,7 @@ class Assets
      *
      * @param array $compilers
      */
-    private function forceCommit(array $compilers)
+    protected function forceCommit(array $compilers): void
     {
         /** @var CompilerInterface $compiler */
         foreach ($compilers as $compiler) {
@@ -70,10 +107,12 @@ class Assets
     }
 
     /**
+     * Maps provided {@link CompilerInterface}s to their URLs.
+     *
      * @param CompilerInterface[] $compilers
      * @return string[]
      */
-    private function getUrls(array $compilers)
+    protected function getUrls(array $compilers): array
     {
         return array_filter(array_map(function (CompilerInterface $compiler) {
             return $compiler->getUrl();