IEntity contains a map of IComponent instances. IComponent could be GameLogic, Physics, or Graphics (stores texture file, mesh file, the IRenderable instance) and other components needed. Each IComponent implementation has it's own manager, like GameLogicManager, PhysicsManager, RenderingManager.
There are two types of managers, the game update managers and rendering manager. The rendering manager only needs to know the position, the IRenderable instance (handles the rendering of each entity depending on its implementation whether mesh or texture), and the bounding information (AABB or sphere or whatever). The GraphicsComponent is the suited component to have these data. It's up to the rendering manager whether to use octree culling, view frustum culling, and so on.
So the game loop will look like:
void update() { gameLogicManager.update(); // performs logic on GameLogic components physicsManager.update(); // performs logic on Physics components // other update managers calls update}void render(){ renderingManager.render(); // it's up to the renderingManager how to render stuff}
I also have a concept of IEntityTemplate objects, like ShipEntityTemplate. This class loads the required components a certain entity needs.