def synthesize_property(property_name,
                        default = None,
                        contract = None,
                        read_only = False,
                        private_member_name = None):
    """
    When applied to a class, this decorator adds a property to it and overrides the constructor in order to set\
    the default value of the property.
    
    :IMPORTANT: In order for this to work on python 2, you must use new objects that is to say that the class must inherit from object.

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

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

    :param property_name: Name of the property to synthesize.
    :type property_name: str
    :param default: Property'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 property will not a have a setter.
    :type read_only: bool
    :param private_member_name: Custom name for the private attribute that contains the property's value.
    :type private_member_name: str|None
    
    :raises: :class:`DuplicateMemberNameError` when two synthetic members have the same name.
    :raises: :class:`InvalidPropertyOverrideError` when there's already a member with that name and which is not a property.
"""
    return SyntheticDecoratorFactory().syntheticMemberDecorator(memberName = property_name,
                                                                defaultValue = default,
                                                                contract = contract,
                                                                readOnly = read_only,
                                                                privateMemberName = private_member_name,
                                                                memberDelegate = PropertyDelegate())