well it passes some tests, need to look into the factory method stuff