use Base.warn_once() instead of warn()