public static function run(Request $Request, $options = array())
    {
        try {
            /**
             * Merge in default options
             */
            $options = array_merge(self::$defaultOptions, $options);
            /**
             * Set the header controller. Can be overwritten by the dispatcher options
             */
            if (
                isset($options['headerController']) &&
                $options['headerController'] instanceof Asset\HeaderSetter
            ) {
                $headerController = $options['headerController'];
            } else {
                $headerController = new Asset\HeaderSetter;
            }
            /**
             * Initialise the Request
             */
            $Request->init();
            /**
             * Grab the correct AssetType
             */
            $AssetType = Asset\Registry::getClass($Request);
            /**
             * Initialise the AssetType
             */
            $AssetType->init();
            /**
             * Create a response
             */
            $Response = new Response($AssetType);
            $Response->setHeaderController($headerController);
            /**
             * Set the headers if told to do so
             */
            if ($options['setHeaders']) {
                /**
                 * Set the headers.
                 */
                $Response->setHeaders($options['maxAge']);
            }
            /**
             * If the content hasn't been modified return null so only headers are sent
             * otherwise return the content
             */
            return $Response->notModified ? null : $Response->render();
        } catch (Asset\NotFoundException $e) {
            if (isset($headerController) && $headerController instanceof Asset\HeaderSetter) {
                $headerController->statusCode('HTTP/1.0', 404, 'Not Found');
                $headerController->headerField('Status', '404 Not Found');
            }

            return 'Not Found Error: ' . static::getErrors($e);
        } catch (Asset\Type\CompilationException $e) {
            if (isset($AssetType) &&  $AssetType instanceof Asset\Type) {
                $AssetType->cleanUpAfterError();
            }

            return 'Compilation Error: ' . static::getErrors($e);
        } catch (ErrorException $e) {
            return 'Error: ' . static::getErrors($e);
        }
    }