add functional implementation