add self_only decorator and clean up api