add oo-dipatch, HOM, decorator patternd