add abstract function