why so complicated? for subclassing?