Fixed various issues with caching and virtual products. Moved some stuff around and renamed mark_exists() to mark_virtual(). Started adding some documentation.