Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > c567edd4605b914c84d9dab4c41a8a5b > files > 682

python-enthought-apptools-3.3.0-2mdv2010.0.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Application Scripting Framework &mdash; AppTools v3.3.0 documentation</title>
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '3.3.0',
        COLLAPSE_MODINDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="top" title="AppTools v3.3.0 documentation" href="../index.html" />
    <link rel="next" title="Permissions Framework - Introduction" href="../permissions/Introduction.html" />
    <link rel="prev" title="AppTools Documentation" href="../index.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../permissions/Introduction.html" title="Permissions Framework - Introduction"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="../index.html" title="AppTools Documentation"
             accesskey="P">previous</a> |</li>
        <li><a href="../index.html">AppTools v3.3.0 documentation</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="application-scripting-framework">
<h1>Application Scripting Framework<a class="headerlink" href="#application-scripting-framework" title="Permalink to this headline">¶</a></h1>
<p>The Application Scripting Framework is a component of the Enthought Tool Suite
that provides developers with an API that allows traits based objects to be
made scriptable.  Operations on a scriptable object can be recorded in a
script and subsequently replayed.</p>
<p>The framework is completely configurable.  Alternate implementations of all
major components can be provided if necessary.</p>
<div class="section" id="framework-concepts">
<h2>Framework Concepts<a class="headerlink" href="#framework-concepts" title="Permalink to this headline">¶</a></h2>
<p>The following are the concepts supported by the framework.</p>
<ul>
<li><p class="first">Scriptable Type</p>
<p>A scriptable type is a sub-type of <tt class="docutils literal"><span class="pre">HasTraits</span></tt> that has scriptable methods
and scriptable traits.  If a scriptable method is called, or a scriptable
trait is set, then that action can be recorded in a script and subsequently
replayed.</p>
<p>If the <tt class="docutils literal"><span class="pre">__init__()</span></tt> method is scriptable then the creation of an object
from the type can be recorded.</p>
<p>Scriptable types can be explicitly defined or created dynamically from any
sub-type of <tt class="docutils literal"><span class="pre">HasTraits</span></tt>.</p>
</li>
<li><p class="first">Scriptable API</p>
<p>The set of a scriptable type&#8217;s scriptable methods and traits constitutes the
type&#8217;s scriptable API.</p>
<p>The API can be defined explicitly using the <tt class="docutils literal"><span class="pre">scriptable</span></tt> decorator (for
methods) or the <tt class="docutils literal"><span class="pre">Scriptable</span></tt> wrapper (for traits).</p>
<p>For scriptable types that are created dynamically then the API can be
defined in terms of one or more types or interfaces or an explicit list of
method and trait names.  By default, all public methods and traits (ie.
those whose name does not begin with an underscore) are part of the API.  It
is also possible to then explicitly exclude a list of method and trait
names.</p>
</li>
<li><p class="first">Scriptable Object</p>
<p>A scriptable object is an instance of a scriptable type.</p>
<p>Scriptable objects can be explicitly created by calling the scriptable type.
Alternatively a non-scriptable object can be made scriptable dynamically.</p>
</li>
<li><p class="first">Script</p>
<p>A script is a Python script and may be a recording or written from scratch.</p>
<p>If the creation of scriptable objects can be recorded, then it may be
possible for a recording to be run directly by the Python interpreter and
independently of the application that made the recording.  Otherwise the
application must run the script and first create any scriptable objects
refered to in the script.</p>
</li>
<li><p class="first">Binding</p>
<p>A script runs in a namespace which is, by default, empty.  If the scriptable
objects refered to in a script are not created by the script (because their
type&#8217;s <tt class="docutils literal"><span class="pre">__init__()</span></tt> method isn&#8217;t scriptable) then they must be created by
the application and added to the namespace.  Adding an object to the
namespace is called binding.</p>
<p>Scriptable objects whose creation can be recorded will automatically bind
themselves when they are created.</p>
<p>It also possible to bind an object factory rather than the object itself.
The factory will be called, and the object created, only if the object is
needed by the script when it is run.  This is typically used by plugins.</p>
<p>The name that an object is bound to need bear no relation to the object&#8217;s
name within the application.  Names may be dotted names (eg. <tt class="docutils literal"><span class="pre">aaa.bbb.ccc</span></tt>)
and appropriate objects representing the intermediate parts of such a name
will be created automatically.</p>
<p>An event is fired whenever an object is bound (or when a bound factory is
invoked).  This allows other objects (eg. an embedded Python shell) to
expose scriptable objects in other ways.</p>
</li>
<li><p class="first">Script Manager</p>
<p>A script manager is responsible for the recording and subsequent playback of
scripts.  An application has a single script manager instance which can be
explicitly set or created automatically.</p>
</li>
</ul>
</div>
<div class="section" id="limitations">
<h2>Limitations<a class="headerlink" href="#limitations" title="Permalink to this headline">¶</a></h2>
<p>In the current implementation scriptable Trait container types (eg. List,
Dict) may only contain objects corresponding to fundamental Python types (eg.
int, bool, str).</p>
</div>
<div class="section" id="api-overview">
<h2>API Overview<a class="headerlink" href="#api-overview" title="Permalink to this headline">¶</a></h2>
<p>This section gives an overview of the API implemented by the framework.  The
complete <a class="reference external" href="api/index.html">API</a> documentation is available as endo generated HTML.</p>
<p>The <a class="reference external" href="https://svn.enthought.com/enthought/browser/AppTools/trunk/examples/appscripting/">example</a> application demonstrates some the features of the framework.</p>
<div class="section" id="module-level-objects">
<h3>Module Level Objects<a class="headerlink" href="#module-level-objects" title="Permalink to this headline">¶</a></h3>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">get_script_manager()</span></tt></dt>
<dd>The application&#8217;s script manager is returned.  One will be created
automatically if needed.</dd>
<dt><tt class="docutils literal"><span class="pre">set_script_manager(script_manager)</span></tt></dt>
<dd>The application&#8217;s script manager will be set to <tt class="docutils literal"><span class="pre">script_manager</span></tt>
replacing any existing script manager.</dd>
<dt><tt class="docutils literal"><span class="pre">scriptable</span></tt></dt>
<dd>This is a decorator used to explicitly mark methods as being scriptable.
Any call to a scriptable method is recorded.  If a type&#8217;s <tt class="docutils literal"><span class="pre">__init__()</span></tt>
method is decorated then the creation of the object will be recorded.</dd>
<dt><tt class="docutils literal"><span class="pre">Scriptable</span></tt></dt>
<dd>This is a wrapper for a trait to explicitly mark it as being scriptable.
Any change to the value of the trait will be recorded.  Simple reads of the
trait will not be recorded unless unless the value read is bound to another
scriptable trait or passed as an argument to a scriptable method.  Passing
<tt class="docutils literal"><span class="pre">has_side_effects=True</span></tt> when wrapping the trait will ensure that a read
will always be recorded.</dd>
<dt><tt class="docutils literal"><span class="pre">create_scriptable_type(script_type,</span> <span class="pre">name=None,</span> <span class="pre">bind_policy='auto',</span> <span class="pre">api=None,</span> <span class="pre">includes=None,</span> <span class="pre">excludes=None,</span> <span class="pre">script_init=True)</span></tt></dt>
<dd><p class="first">This creates a new type based on an existing type but with certain methods
and traits marked as being scriptable.  Scriptable objects can then be
created by calling the type.</p>
<p><tt class="docutils literal"><span class="pre">script_type</span></tt> is the existing, non-scriptable, type.  The new type will
be a sub-type of it.  The <tt class="docutils literal"><span class="pre">api</span></tt>, <tt class="docutils literal"><span class="pre">includes</span></tt> and <tt class="docutils literal"><span class="pre">excludes</span></tt> arguments
determine which methods and traits are made scriptable.  By default, all
public methods and traits (ie. those whose name does not begin with an
underscore) are made scriptable.</p>
<p>The <tt class="docutils literal"><span class="pre">name</span></tt> and <tt class="docutils literal"><span class="pre">bind_policy</span></tt> arguments determine how scriptable
objects are bound when they are created.  <tt class="docutils literal"><span class="pre">name</span></tt> is the name that an
object will be bound to.  It defaults to the name of <tt class="docutils literal"><span class="pre">script_type</span></tt> with
the first character forced to lower case.  <tt class="docutils literal"><span class="pre">name</span></tt> may be a dotted name,
eg. <tt class="docutils literal"><span class="pre">aaa.bb.c</span></tt>.</p>
<p><tt class="docutils literal"><span class="pre">bind_policy</span></tt> determines what happens if an object is already bound to
the name.  If it is <tt class="docutils literal"><span class="pre">auto</span></tt> then a numerical suffix will be added to the
name of the new object.  If it is <tt class="docutils literal"><span class="pre">unique</span></tt> then an exception will be
raised.  If it is <tt class="docutils literal"><span class="pre">rebind</span></tt> then the object currently bound to the name
will be unbound.</p>
<p><tt class="docutils literal"><span class="pre">api</span></tt> is a class or interface (or a list of classes or interfaces) that
is used to provide the names of the methods and traits to be made
scriptable.  The class or interface effectively defines the scripting API.</p>
<p>If <tt class="docutils literal"><span class="pre">api</span></tt> is not specified then <tt class="docutils literal"><span class="pre">includes</span></tt> is a list of method and
trait names that are made scriptable.</p>
<p>If <tt class="docutils literal"><span class="pre">api</span></tt> and <tt class="docutils literal"><span class="pre">includes</span></tt> are not specified then <tt class="docutils literal"><span class="pre">excludes</span></tt> is a list
of method and trait names that are <em>not</em> made scriptable.</p>
<p>If <tt class="docutils literal"><span class="pre">script_init</span></tt> is set then the <tt class="docutils literal"><span class="pre">__init__()</span></tt> method is made scriptable
irrespective of the <tt class="docutils literal"><span class="pre">api</span></tt>, <tt class="docutils literal"><span class="pre">includes</span></tt> and <tt class="docutils literal"><span class="pre">excludes</span></tt> arguments.</p>
<p class="last">If <tt class="docutils literal"><span class="pre">script_init</span></tt> is not set then objects must be explicitly bound and
<tt class="docutils literal"><span class="pre">name</span></tt> and <tt class="docutils literal"><span class="pre">bind_policy</span></tt> are ignored.</p>
</dd>
<dt><tt class="docutils literal"><span class="pre">make_object_scriptable(obj,</span> <span class="pre">api=None,</span> <span class="pre">includes=None,</span> <span class="pre">excludes=None)</span></tt></dt>
<dd><p class="first">This takes an existing unscriptable object and makes it scriptable.  It
works by calling <tt class="docutils literal"><span class="pre">create_scriptable_type()</span></tt> on the the objects existing
type and replacing that existing type with the new scriptable type.</p>
<p class="last">See the description of <tt class="docutils literal"><span class="pre">create_scriptable_type()</span></tt> for an explanation of
the <tt class="docutils literal"><span class="pre">api</span></tt>, <tt class="docutils literal"><span class="pre">includes</span></tt> and <tt class="docutils literal"><span class="pre">excludes</span></tt> arguments.</p>
</dd>
</dl>
</div>
<div class="section" id="scriptmanager">
<h3>ScriptManager<a class="headerlink" href="#scriptmanager" title="Permalink to this headline">¶</a></h3>
<p>The <tt class="docutils literal"><span class="pre">ScriptManager</span></tt> class is the default implementation of the
<tt class="docutils literal"><span class="pre">IScriptManager</span></tt> interface.</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">bind_event</span></tt></dt>
<dd>This event is fired whenever an object is bound or unbound.  The event&#8217;s
argument implements the <tt class="docutils literal"><span class="pre">IBindEvent</span></tt> interface.</dd>
<dt><tt class="docutils literal"><span class="pre">recording</span></tt></dt>
<dd>This trait is set if a script is currently being recorded.  It is updated
automatically by the script manager.</dd>
<dt><tt class="docutils literal"><span class="pre">script</span></tt></dt>
<dd>This trait contains the text of the script currently being recorded (or
the last recorded script if one is not being currently recorded).  It is
updated automatically by the script manager.</dd>
<dt><tt class="docutils literal"><span class="pre">script_updated</span></tt></dt>
<dd>This event is fired whenever the <tt class="docutils literal"><span class="pre">script</span></tt> trait is updated.  The event&#8217;s
argument is the script manager.</dd>
<dt><tt class="docutils literal"><span class="pre">bind(self,</span> <span class="pre">obj,</span> <span class="pre">name=None,</span> <span class="pre">bind_policy='unique',</span> <span class="pre">api=None,</span> <span class="pre">includes=None,</span> <span class="pre">excludes=None)</span></tt></dt>
<dd>This method makes an object scriptable and binds it to a name.  See the
description of <tt class="docutils literal"><span class="pre">create_scriptable_type()</span></tt> for an explanation of the
<tt class="docutils literal"><span class="pre">api</span></tt>, <tt class="docutils literal"><span class="pre">includes</span></tt>, <tt class="docutils literal"><span class="pre">excludes</span></tt>, <tt class="docutils literal"><span class="pre">name</span></tt> and <tt class="docutils literal"><span class="pre">bind_policy</span></tt>
arguments.</dd>
<dt><tt class="docutils literal"><span class="pre">bind_factory(self,</span> <span class="pre">factory,</span> <span class="pre">name,</span> <span class="pre">bind_policy='unique',</span> <span class="pre">api=None,</span> <span class="pre">includes=None,</span> <span class="pre">excludes=None)</span></tt></dt>
<dd>This method binds an object factory to a name.  The factory is called to
create the object (and make it scriptable) only when the object is needed
by a running script.  See the description of <tt class="docutils literal"><span class="pre">create_scriptable_type()</span></tt>
for an explanation of the <tt class="docutils literal"><span class="pre">name</span></tt> and <tt class="docutils literal"><span class="pre">bind_policy</span></tt> arguments.</dd>
<dt><tt class="docutils literal"><span class="pre">run(self,</span> <span class="pre">script)</span></tt></dt>
<dd>This method runs a script in a namespace containing all currently bound
objects.  <tt class="docutils literal"><span class="pre">script</span></tt> is any object that can be used by Python&#8217;s <tt class="docutils literal"><span class="pre">exec</span></tt>
statement including a string or a file-like object.</dd>
<dt><tt class="docutils literal"><span class="pre">run_file(self,</span> <span class="pre">file_name)</span></tt></dt>
<dd>This method runs a script in a namespace containing all currently bound
objects.  <tt class="docutils literal"><span class="pre">file_name</span></tt> is the name of a file containing the script.</dd>
<dt><tt class="docutils literal"><span class="pre">start_recording(self)</span></tt></dt>
<dd>This method starts the recording of a script.</dd>
<dt><tt class="docutils literal"><span class="pre">stop_recording(self)</span></tt></dt>
<dd>This method stops the recording of the current script.</dd>
</dl>
</div>
<div class="section" id="ibindevent">
<h3>IBindEvent<a class="headerlink" href="#ibindevent" title="Permalink to this headline">¶</a></h3>
<p>The <tt class="docutils literal"><span class="pre">IBindEvent</span></tt> interface defines the interface that is implemented by the
object passed when the script manager&#8217;s <tt class="docutils literal"><span class="pre">bind_event</span></tt> is fired.</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">name</span></tt></dt>
<dd>This trait is the name being bound or unbound.</dd>
<dt><tt class="docutils literal"><span class="pre">obj</span></tt></dt>
<dd>This trait is the obj being bound to <tt class="docutils literal"><span class="pre">name</span></tt> or None if <tt class="docutils literal"><span class="pre">name</span></tt> is being
unbound.</dd>
</dl>
</div>
<div class="section" id="startrecordingaction">
<h3>StartRecordingAction<a class="headerlink" href="#startrecordingaction" title="Permalink to this headline">¶</a></h3>
<p>The <tt class="docutils literal"><span class="pre">StartRecordingAction</span></tt> class is a canned PyFace action that starts the
recording of changes to scriptable objects to a script.</p>
</div>
<div class="section" id="stoprecordingaction">
<h3>StopRecordingAction<a class="headerlink" href="#stoprecordingaction" title="Permalink to this headline">¶</a></h3>
<p>The <tt class="docutils literal"><span class="pre">StopRecordingAction</span></tt> class is a canned PyFace action that ends the
recording of changes to scriptable objects to a script.</p>
</div>
</div>
<div class="section" id="implementing-application-scripting">
<h2>Implementing Application Scripting<a class="headerlink" href="#implementing-application-scripting" title="Permalink to this headline">¶</a></h2>
<p>The key part of supporting application scripting is to design an appropriate
scripting API and to ensure than the application itself uses the API so that
changes to the data can be recorded.  The framework provides many ways to
specify the scripting API.  Which approach is appropriate in a particular case
will depend on when it is a new application, or whether scripting is being
added to an existing application, and how complex the application&#8217;s data model
is.</p>
<div class="section" id="static-specification">
<h3>Static Specification<a class="headerlink" href="#static-specification" title="Permalink to this headline">¶</a></h3>
<p>A scripting API is specified statically by the explicit use of the
<tt class="docutils literal"><span class="pre">scriptable</span></tt> decorator and the <tt class="docutils literal"><span class="pre">Scriptable</span></tt> trait wrapper.  For example:</p>
<div class="highlight-python"><pre>from enthought.appscripting.api import scriptable, Scriptable
from enthought.traits.api import HasTraits, Int, Str

class DataModel(HasTraits):

    foo = Scriptable(Str)

    bar = Scriptable(Int, has_side_effects=True)

    @scriptable
    def baz(self):
        pass

    def weeble(self)
        pass

# Create the scriptable object.  It's creation won't be recorded because
# __init__() isn't decorated.
obj = DataModel()

# These will be recorded.
obj.foo = ''
obj.bar = 10
obj.baz()

# This will not be recorded.
obj.weeble()

# This won't be recorded unless 'f' is passed to something that is
# recorded.
f = obj.foo

# This will be recorded because we set 'has_side_effects'.
b = obj.bar</pre>
</div>
</div>
<div class="section" id="dynamic-specification">
<h3>Dynamic Specification<a class="headerlink" href="#dynamic-specification" title="Permalink to this headline">¶</a></h3>
<p>A scripting API can also be specified dynamically.  The following example
produces a scriptable object with the same scriptable API as above (with the
exception that <tt class="docutils literal"><span class="pre">has_side_effects</span></tt> cannot be specified dynamically):</p>
<div class="highlight-python"><pre>from enthought.appscripting.api import create_scriptable_type
from enthought.traits.api import HasTraits, Int, Str

class DataModel(HasTraits):

    foo = Str

    bar = Int

    def baz(self):
        pass

    def weeble(self)
        pass

# Create a scriptable type based on the above.
ScriptableDataModel = create_scriptable_type(DataModel, excludes=['weeble'])

# Now create scriptable objects from the scriptable type.  Note that each
# object has the same type.
obj1 = ScriptableDataModel()
obj2 = ScriptableDataModel()</pre>
</div>
<p>Instead we could bypass the type and make the objects themselves scriptable as
follows:</p>
<div class="highlight-python"><pre>from enthought.appscripting.api import make_object_scriptable
from enthought.traits.api import HasTraits, Int, Str

class DataModel(HasTraits):

    foo = Str

    bar = Int

    def baz(self):
        pass

    def weeble(self)
        pass

# Create unscriptable objects.
obj1 = DataModel()
obj2 = DataModel()

# Now make the objects scriptable.  Note that each object has a different
# type, each a sub-type of 'DataModel'.
make_object_scriptable(obj1, excludes=['weeble'])
make_object_scriptable(obj2, excludes=['weeble'])</pre>
</div>
<p>With a more sophisticated design we may choose to specify the scriptable API as
an interface as follows:</p>
<div class="highlight-python"><pre>from enthought.appscripting.api import make_object_scriptable
from enthought.traits.api import HasTraits, Int, Interface, Str

class DataModel(HasTraits):

    foo = Str

    bar = Int

    def baz(self):
        pass

    def weeble(self)
        pass

class IScriptableDataModel(Interface):

    foo = Str

    bar = Int

    def baz(self):
        pass

# Create an unscriptable object.
obj = DataModel()

# Now make the object scriptable.
make_object_scriptable(obj, api=IScriptableDataModel)</pre>
</div>
</div>
<div class="section" id="scripting-init">
<h3>Scripting __init__()<a class="headerlink" href="#scripting-init" title="Permalink to this headline">¶</a></h3>
<p>Making a type&#8217;s <tt class="docutils literal"><span class="pre">__init__()</span></tt> method has advantages and disadvantages.  It
means that the creation of scriptable objects will be recorded in a script
(along with the necessary <tt class="docutils literal"><span class="pre">import</span></tt> statements).  This means that the script
can be run independently of your application by the standard Python
interpreter.</p>
<p>The disadvantage is that, if you have a complex data model, with many
interdependencies, then defining a complete and consistent scripting API that
allows a script to run independently may prove difficult.  In such cases it is
better to have the application create and bind the scriptable objects itself.</p>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="../index.html">Table Of Contents</a></h3>
            <ul>
<li><a class="reference external" href="">Application Scripting Framework</a><ul>
<li><a class="reference external" href="#framework-concepts">Framework Concepts</a></li>
<li><a class="reference external" href="#limitations">Limitations</a></li>
<li><a class="reference external" href="#api-overview">API Overview</a><ul>
<li><a class="reference external" href="#module-level-objects">Module Level Objects</a></li>
<li><a class="reference external" href="#scriptmanager">ScriptManager</a></li>
<li><a class="reference external" href="#ibindevent">IBindEvent</a></li>
<li><a class="reference external" href="#startrecordingaction">StartRecordingAction</a></li>
<li><a class="reference external" href="#stoprecordingaction">StopRecordingAction</a></li>
</ul>
</li>
<li><a class="reference external" href="#implementing-application-scripting">Implementing Application Scripting</a><ul>
<li><a class="reference external" href="#static-specification">Static Specification</a></li>
<li><a class="reference external" href="#dynamic-specification">Dynamic Specification</a></li>
<li><a class="reference external" href="#scripting-init">Scripting __init__()</a></li>
</ul>
</li>
</ul>
</li>
</ul>

            <h4>Previous topic</h4>
            <p class="topless"><a href="../index.html"
                                  title="previous chapter">AppTools Documentation</a></p>
            <h4>Next topic</h4>
            <p class="topless"><a href="../permissions/Introduction.html"
                                  title="next chapter">Permissions Framework - Introduction</a></p>
            <h3>This Page</h3>
            <ul class="this-page-menu">
              <li><a href="../_sources/appscripting/Introduction.txt"
                     rel="nofollow">Show Source</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Quick search</h3>
              <form class="search" action="../search.html" method="get">
                <input type="text" name="q" size="18" />
                <input type="submit" value="Go" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Enter search terms or a module, class or function name.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../permissions/Introduction.html" title="Permissions Framework - Introduction"
             >next</a> |</li>
        <li class="right" >
          <a href="../index.html" title="AppTools Documentation"
             >previous</a> |</li>
        <li><a href="../index.html">AppTools v3.3.0 documentation</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; Copyright 2008, Enthought.
      Last updated on Aug 21, 2009.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.2.
    </div>
  </body>
</html>