refactor (composite pattern for eval) WORKING