self-defining functions