use eieio class instead of cl-lib struct