add polymorphic support