public static function createUpdate($class, $filename = null)
 {
     $file = str_replace('_', '/', $class);
     $isSql = false;
     if (!$filename) {
         if (is_file($file . '.sql')) {
             $filename = $file . '.sql';
             $isSql = true;
         } else {
             if (is_file(KWF_PATH . '/' . $file . '.sql')) {
                 $filename = KWF_PATH . '/' . $file . '.sql';
                 $isSql = true;
             }
         }
     } else {
         $isSql = substr($filename, -4) == '.sql';
     }
     $update = null;
     if ($isSql) {
         $update = new Kwf_Update_Sql($class);
         $update->sql = file_get_contents($filename);
         if (preg_match("#\\#\\s*tags:(.*)#", $update->sql, $m)) {
             $update->setTags(explode(' ', trim($m[1])));
         }
     } else {
         $update = new $class($class);
         if (!$update instanceof Kwf_Update) {
             throw new Kwf_Exception("Invalid update class: '{$class}'");
         }
     }
     return $update;
 }