def for_all(*generators):
    """
    Takes a list of generators and returns a closure which takes a property,
    then tests the property against arbitrary instances of the generators.
    """
    # Pass in n as an argument
    n = 100

    def test_property(property_function):
        """
        A closure which takes a property and tests it against arbitrary
        instances of the generators in the closure.
        """
        for generator in generators:
            assert (issubclass(generator, ArbitraryInterface)
                    or generator in arbitrary)

        def test_once():
            """
            Tests the property against a single set of instances of the
            generators.
            """
            instances = [arbitrary(generator) for generator in generators]
            try:
                assert property_function(*instances)
            except AssertionError:
                generator_names = ', '.join(
                    generator.__name__ for generator in generators)
                stringed_instances = ', '.join(
                    str(instance) for instance in instances)
                error_message = ' '.join([
                    'Instances <', stringed_instances, '> of <',
                    generator_names, '> do not satisfy a property.'
                ])
                raise AssertionError(error_message)

        for _ in range(n):
            test_once()

    return test_property
Takes a list of generators and returns a closure which takes a property,
    then tests the property against arbitrary instances of the generators.