use Object.defineProperty if available