most rules implemented, going to refactor