basic functionality; needs tests and helpers and 'do' implementation