@Override
	public Object getObject() throws BeansException {
		ProxyFactory factory = new ProxyFactory();
		factory.setInterfaces(new Class<?>[] { beanType, Lazy.class }); // TODO support base classes, multiple interfaces
		
		MethodHandler handler = new MethodHandler() {
			@Override
			public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
				if (Arrays.asList("toString", "equals", "hashCode").contains(thisMethod.getName())) {
					return proceed.invoke(self, args);
				}
				if (thisMethod.getDeclaringClass().isAssignableFrom(beanType)) {
					try {
						return thisMethod.invoke(getBean(), args);
					} catch (InvocationTargetException e) {
						throw e.getTargetException();
					}
				} else {
					return proceed.invoke(self, args);
				}
			}
		};
		
		try {
			wrapper = factory.create(new Class<?>[0], new Object[0], handler);
			return wrapper;
		} catch (RuntimeException re) {
			throw re;
		} catch (Exception e) {
			throw new IllegalStateException(e);
		}
	}