big rewrite - no more eval