When applied to a class, this decorator adds getter/setter methods to it and overrides the constructor in order to set\
    the default value of the member.
    By default, the getter will be named ``member_name``. (Ex.: ``member_name = 'member' => instance.member()``)
    
    By default, the setter will be named ``member_name`` with 'set\_' prepended it to it.
    (Ex.: ``member_name = 'member' => instance.set_member(...)``)

    By default, the private attribute containing the member's value will be named ``member_name`` with '_' prepended to it.

    Naming convention can be overridden with a custom one using :meth:`naming_convention <naming_convention>` decorator.

    :param member_name: Name of the member to synthesize.
    :type member_name: str
    :param default: Member's default value.
    :type default: *
    :param contract: Type constraint. See `PyContracts <http://andreacensi.github.com/contracts/>`_
    :type contract: *
    :param read_only: If set to ``True``, the setter will not be added to the class.
    :type read_only: bool
    :param getter_name: Custom getter name. This can be useful when the member is a boolean. (Ex.: ``is_alive``)
    :type getter_name: str|None
    :param setter_name: Custom setter name.
    :type setter_name: str|None
    :param private_member_name: Custom name for the private attribute that contains the member's value.
    :type private_member_name: str|None
    
    :raises: :class:`DuplicateMemberNameError` when two synthetic members have the same name.

def synthesize_member(member_name,
                      default = None,
                      contract = None,
                      read_only = False,
                      getter_name = None,
                      setter_name = None,
                      private_member_name = None):
    """
    When applied to a class, this decorator adds getter/setter methods to it and overrides the constructor in order to set\
    the default value of the member.
    By default, the getter will be named ``member_name``. (Ex.: ``member_name = 'member' => instance.member()``)
    
    By default, the setter will be named ``member_name`` with 'set\_' prepended it to it.
    (Ex.: ``member_name = 'member' => instance.set_member(...)``)

    By default, the private attribute containing the member's value will be named ``member_name`` with '_' prepended to it.

    Naming convention can be overridden with a custom one using :meth:`naming_convention <naming_convention>` decorator.

    :param member_name: Name of the member to synthesize.
    :type member_name: str
    :param default: Member's default value.
    :type default: *
    :param contract: Type constraint. See `PyContracts <http://andreacensi.github.com/contracts/>`_
    :type contract: *
    :param read_only: If set to ``True``, the setter will not be added to the class.
    :type read_only: bool
    :param getter_name: Custom getter name. This can be useful when the member is a boolean. (Ex.: ``is_alive``)
    :type getter_name: str|None
    :param setter_name: Custom setter name.
    :type setter_name: str|None
    :param private_member_name: Custom name for the private attribute that contains the member's value.
    :type private_member_name: str|None
    
    :raises: :class:`DuplicateMemberNameError` when two synthetic members have the same name.
"""
    accessorDelegate = AccessorDelegate(namingConvention = NamingConventionUnderscore(),
                                       getterName = getter_name,
                                       setterName = setter_name)
    return SyntheticDecoratorFactory().syntheticMemberDecorator(memberName = member_name,
                                                                defaultValue = default,
                                                                contract = contract,
                                                                readOnly = read_only,
                                                                privateMemberName = private_member_name,
                                                                memberDelegate = accessorDelegate)