because we implement Function