protected function handleView($class, $method, $data, $annotation)
    {
        // check if a @view definition exists on method's annotations
        if (empty($annotation)) {
            return null; // no @view annotation found, just return to break view handling
        }

        $annotation->prepare();
        $template = $annotation->template;

        // check if template filename is empty
        if (empty($template)) {
            // that means the annotation "@view" was not set
            // Then we compose a template filename using controller class and method names but
            // removing ...Controller & ..Action suffixes from those names
            $nsSepPos  = strrpos($class, '\\');
            $class = preg_replace('/([A-Z])/', '_$1', substr($class, $nsSepPos + 1, -10));
            $class = strtolower(ltrim($class, "_"));
            $method = substr($method, 0, -6);
            $template = $class . DS . $method;
        }

        $view = $this->createView($template, $data, $annotation->engine);
        $registeredVars = array();

        // for javascript annotated
        if ($registerAnnotation = $this->annotationReader->getAnnotation('RegisterJavascript')) {
            $registeredVars = $registerAnnotation->all();

            $publicBasePath = $this->config->get('app.public_dir') . DS;
            $sourceBasePath = $this->config->get('app.view_scripts_javascript_dir') . DS;
            $jsBaseUrl = 'assets/cache/';

            foreach ($registeredVars as  $i => $jsFile) {
                if (! file_exists($sourceBasePath . $jsFile)) {
                    throw new \Exception(sprintf("File Not Found Error: File %s doesn't exist!.", $jsFile));
                }

                $jsPath  = substr($jsFile, 0, strrpos($jsFile, DS));
                $fileSum = md5_file($sourceBasePath . $jsFile);
                $jsCacheFile = rtrim($jsFile, '.js') . '-' . $fileSum . '.js';

                // verify if the source file was modified since last cache generated version
                if (! is_file($publicBasePath . $jsBaseUrl . $jsCacheFile)) {
                    if (! is_dir($publicBasePath . $jsBaseUrl . $jsPath)) {
                        self::createDir($publicBasePath . $jsBaseUrl . $jsPath);
                    }

                    // clean up -! Remove old cache file
                    $oldCacheFiles = glob($publicBasePath . $jsBaseUrl . rtrim($jsFile, '.js') . '-*');
                    if (count($oldCacheFiles) > 0) {
                        foreach ($oldCacheFiles as $oldCacheFile) {
                            @unlink($oldCacheFile);
                        }
                    }

                    // TODO copy a minified version instead a normal copy, it depends if it is a debug env.
                    copy($sourceBasePath . $jsFile, $publicBasePath . $jsBaseUrl . $jsCacheFile);
                }

                // adding the new js file path to assign as variable to view object
                $registeredVars[$i] = $jsBaseUrl . $jsCacheFile;
            }
        }
        // end javascript registration

        // registering variables
        $view->assign('javascript', $registeredVars);

        return $view;
    }