if (ref($proto)) { if (ref($_[0])) { cross polinate } else { mutate } } else { construct new }