pull out predicate components to avoid __call__