base implementation
functional