added self_defined