implement defmethod and defgeneric