use less expensive introspection; remove decorator requirement