@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			int tokenCost = tokenCostFunction.calculateCost(method, args);
			if (callSpec.matches(method, args) && !tokenBucket.getTokens(tokenCost)) {
				throw new CapacityExceededException();
			} else {
				return method.invoke(underlying, args);
			}
		}