# Path: infi/pyutils/exceptions.py
# class SignatureException(ReflectionException):
#     pass
# 
# class InvalidKeywordArgument(ReflectionException):
#     pass
# 
# class UnknownArguments(SignatureException):
#     pass
# 
# class MissingArguments(SignatureException):
#     pass


from types import MethodType
from .exceptions import (
    SignatureException,
    InvalidKeywordArgument,
    UnknownArguments,
    MissingArguments,
    )
from numbers import Number
import copy
import inspect
import itertools
import platform

_IS_PY3 = platform.python_version() >= '3'
if _IS_PY3:
    iteritems = dict.items
    izip = zip
    basestring = str
else:
    izip = itertools.izip
    iteritems = dict.iteritems

_NO_DEFAULT = object()

class Argument(object):
    def __init__(self, name, default=_NO_DEFAULT):
        super(Argument, self).__init__()
        self.name = name
        self.default = default
    def has_default(self):
        return self.default is not _NO_DEFAULT

class FunctionSignature(object):
    def __init__(self, func):
        super(FunctionSignature, self).__init__()
        self.func = func
        self.func_name = func.__name__
        self._build_arguments()
    def is_bound_method(self):
        return is_bound_method(self.func)
    def is_class_method(self):

# Path: infi/pyutils/exceptions.py
# class SignatureException(ReflectionException):
#     pass
# 
# class InvalidKeywordArgument(ReflectionException):
#     pass
# 
# class UnknownArguments(SignatureException):
#     pass
# 
# class MissingArguments(SignatureException):
#     pass


# Path: infi/pyutils/function_signature.py
from types import MethodType
from .exceptions import (
    SignatureException,
    InvalidKeywordArgument,
    UnknownArguments,
    MissingArguments,
    )
from numbers import Number
import copy
import inspect
import itertools
import platform


_IS_PY3 = platform.python_version() >= '3'
if _IS_PY3:
    iteritems = dict.items
    izip = zip
    basestring = str
else:
    izip = itertools.izip
    iteritems = dict.iteritems

_NO_DEFAULT = object()

class Argument(object):
    def __init__(self, name, default=_NO_DEFAULT):
        super(Argument, self).__init__()
        self.name = name
        self.default = default
    def has_default(self):
        return self.default is not _NO_DEFAULT

class FunctionSignature(object):
    def __init__(self, func):
        super(FunctionSignature, self).__init__()
        self.func = func
        self.func_name = func.__name__
        self._build_arguments()
    def is_bound_method(self):
        return is_bound_method(self.func)
    def is_class_method(self):

        return is_class_method(self.func)