def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod( obj.api_version.get_string(), name) method = max(methods, key=lambda f: f.start_version) return method.func(obj, *args, **kwargs) if hasattr(func, 'arguments'): for cli_args, cli_kwargs in func.arguments: utils.add_arg(substitution, *cli_args, **cli_kwargs) return substitution