polymorphic & automatic cleanup