Product - Refresh: Reload a filesystem-based Python product.
  
  Description

    This view allows you to reload filesystem-based product code
    without restarting Zope.  This function is useful during
    development of products.

    To enable your product to be refreshed, it is required that you
    put a file called 'refresh.txt' in your product directory.
    It can optionally contain a warning for others who might use
    the refresh function.

    (Producting refreshing is not perfect.  Some products, especially
    "hotfix" style products which patch Zope, should not be refreshed.
    That's why 'refresh.txt' is required.  Most products are safe to
    refresh, however.)

    There are two modes of operation.  You can visit your product's
    'Refresh' tab and manually push the refresh button.  Or you can
    turn on "auto-refresh" mode, which causes Zope to periodically
    scan the modification time of the Python files that make up your
    product and execute a refresh operation in the background.

    **NOTE**: Don't enable auto-refresh for too many products at once.
    Scanning file modification times can take a lot of time per
    request.

    You can also select dependent refreshable products.  If you have
    a product that subclasses from a product you're working on,
    you'll want to enable refresh for both products and add the
    product that subclasses as a dependent of the product you're
    modifying.  This enables subclasses to be updated.

  Controls

    'Refresh this product' -- The manual refresh button.

    'Auto refresh mode' -- Check the checkbox to enable auto-refresh.

    'Dependent auto-refreshable products' -- A list of other products
    which are auto-refreshable.

  How it works

    To execute a refresh, Zope looks in the sys.modules dictionary
    for modules with names that start with the prefix for your product.
    It tries to scan for dependencies between the modules that make
    up your product then uses Python's reload() function for each
    module in order.  Then it sets a flag that will cause ZODB to dump
    its cache on the next connection so that changes to persistent
    classes will take effect.

    To implement auto-refresh, Zope stores a PersistentMapping called
    RefreshData on the database root object (below the Application
    object).  The contents of the PersistentMapping are examined at the
    moment a database connection is opened by ZApplication.  The
    PersistentMapping contains a list of which products have auto-refresh
    enabled.  For each product with auto-refresh enabled, Zope compares
    the file mod times with the last recorded times and executes a
    refresh if there are any changes.

