Marked needsOnStateChange as "private"