more complicated func subs