try to support lazy evaluation