change abstract function to be extern