Subversion Info

Rev
437
Last Checked In
2008-03-28 00:49:20 (2 weeks ago)
Checked in by
deveiant

Parent

Included Modules

Class Index

Quicksearch

Arrow::AppletRegistry

Instances of this class are responsible for maintaining the collection of Arrow::Applets in an application..

Constants

SVNRev
SVN Revision
SVNId
SVN Id
IDENTIFIER
Pattern for matching valid components of the uri
ChainLink
Link in an applet chain

Attributes

config[R]
The Arrow::Config object which specified the registry‘s behavior.
filemap[R]
The internal hash of Entry objects keyed by the file they were loaded from
urispace[R]
The internal hash of Entry objects, keyed by URI

Public Class Methods

new( config ) click to toggle source

Create a new Arrow::AppletRegistry object.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 210
210:     def initialize( config )
211:         @config = config
212:     
213:         @classmap = nil
214:         @filemap = {}
215:         @urispace = {}
216:         @template_factory = Arrow::TemplateFactory.new( config )
217:         
218:         self.load_applets
219:         super()
220:     end

Public Instance Methods

check_for_updates() click to toggle source

Check the applets path for new/updated/deleted applets if the poll interval has passed.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 329
329:     def check_for_updates
330:         interval = @config.applets.pollInterval
331:         if interval.nonzero?
332:             if Time.now - @loadTime > interval
333:                 self.log.debug "Checking for applet updates: poll interval at %ds" % interval
334:                 self.reload_applets
335:             end
336:         else
337:             self.log.debug "Dynamic applet reloading turned off, continuing"
338:         end
339:     end
find_applet_chain( uri ) click to toggle source

Find the chain of applets indicated by the given uri and return an Array of ChainLink structs.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 257
257:     def find_applet_chain( uri )
258:         self.log.debug "Searching urispace %p for appletchain for %p" %
259:           [@urispace.keys.sort, uri]
260: 
261:         uri_parts = uri.sub(%r{^/(?=.)}, '').split(%r{/}).grep( IDENTIFIER )
262:         appletchain = []
263:         args = []
264: 
265:         # If there's an applet installed at the base, prepend it to the
266:         # appletchain
267:         if @urispace.key?( "" )
268:             appletchain << ChainLink.new( @urispace[""], "", uri_parts )
269:             self.log.debug "Added base applet to chain."
270:         end
271: 
272:         # Only allow reference to internal handlers (handlers mapped to 
273:         # directories that start with '_') if allow_internal is set.
274:         self.log.debug "Split URI into parts: %p" % [uri_parts]
275: 
276:         # Map uri fragments onto registry entries, stopping at any element 
277:         # which isn't a valid Ruby identifier.
278:         uri_parts.each_index do |i|
279:             newuri = uri_parts[0,i+1].join("/")
280:             self.log.debug "Testing %s against %p" % [ newuri, @urispace.keys.sort ]
281:             appletchain << ChainLink.new( @urispace[newuri], newuri, uri_parts[(i+1)..-1] ) if
282:                 @urispace.key?( newuri )
283:         end
284: 
285:         return appletchain
286:     end
load_applets() click to toggle source

Load any new applets in the registry‘s path, reload any previously- loaded applets whose files have changed, and discard any applets whose files have disappeared.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 303
303:     def load_applets
304:         self.log.debug "Loading applet registry"
305: 
306:         @classmap = self.build_classmap
307:         filelist = self.find_appletfiles
308: 
309:         # Remove applet files which correspond to files that are no longer
310:         # in the list
311:         self.purge_deleted_applets( @filemap.keys - filelist ) unless 
312:             @filemap.empty?
313: 
314:         # Now search the applet path for applet files
315:         filelist.each do |appletfile|
316:             self.log.debug "Found applet file %p" % appletfile
317:             self.load_applets_from_file( appletfile )
318:             self.log.debug "After %s, registry has %d entries" %
319:                 [ appletfile, @urispace.length ]
320:         end
321: 
322:         @loadTime = Time.now
323:     end
Also aliased as: reload_applets
reload_applets() click to toggle source

Alias for #load_applets

Protected Instance Methods

build_classmap() click to toggle source

Make and return a Hash which inverts the registry‘s applet layout into a map of class name to the URIs onto which instances of them should be installed.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 449
449:     def build_classmap
450:         classmap = Hash.new {|ary,k| ary[k] = []}
451: 
452:         # Invert the applet layout into Class => [ uris ] so as classes
453:         # load, we know where to put 'em.
454:         @config.applets.layout.each do |uri, klassname|
455:             uri = uri.to_s.sub( %r{^/}, '' )
456:             self.log.debug "Mapping %p to %p" % [ klassname, uri ]
457:             classmap[ klassname ] << uri
458:         end
459: 
460:         return classmap
461:     end
find_appletfiles( excludeList=[] ) click to toggle source

Find applet files by looking in the applets path of the registry‘s configuration for files matching the configured pattern. Return an Array of fully-qualified applet files. If the optional excludeList is given, exclude any files specified from the return value.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 468
468:     def find_appletfiles( excludeList=[] )
469:         files = []
470:         dirCount = 0
471: 
472:         # For each directory in the configured applets path,
473:         # fully-qualify it and untaint the specified pathname.
474:         @config.applets.path.each do |path|
475: 
476:             # Look for files under a directory
477:             if File.directory?( path )
478:                 dirCount += 1
479:                 pat = File.join( path, @config.applets.pattern )
480:                 pat.untaint
481: 
482:                 self.log.debug "Looking for applets: %p" % pat
483:                 files.push( *Dir[ pat ] )
484:             elsif File.file?( path )
485:                 files.push( path )
486:             end
487:         end
488: 
489:         self.log.info "Fetched %d applet file paths from %d directories (out of %d)" %
490:             [ files.nitems, dirCount, @config.applets.path.dirs.nitems ]
491: 
492:         files.each {|file| file.untaint }
493:         return files - excludeList
494:     end
load_applets_from_file( path ) click to toggle source

Load the applet classes from the given path and return them in an Array. If a block is given, then each loaded class is yielded to the block in turn, and the return values are used in the Array instead.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 371
371:     def load_applets_from_file( path )
372: 
373:         # Reload mode -- don't do anything unless the file's been updated
374:         if @filemap.key?( path )
375:             file = @filemap[ path ]
376:             
377:             if file.has_changed?
378:                 self.log.info "File %p has changed since loaded. Reloading." % [path]
379:                 self.purge_deleted_applets( path )
380:             elsif !file.loaded_okay?
381:                 self.log.warning "File %s could not be loaded: %s" % 
382:                     [path, file.exception.message]
383:                 file.exception.backtrace.each do |frame|
384:                     self.log.debug "  " + frame
385:                 end
386:             else
387:                 self.log.debug "File %p has not changed." % [path]
388:                 return nil
389:             end
390:         end
391: 
392:         self.log.debug "Attempting to load applet objects from %p" % path
393:         @filemap[ path ] = AppletFile.new( path )
394:     
395:         @filemap[ path ].appletclasses.each do |appletclass|
396:             self.log.debug "Registering applet class %s from %p" % [appletclass.name, path]
397:             begin
398:                 uris = self.register_applet_class( appletclass )
399:                 @filemap[ path ].uris << uris
400:             rescue ::Exception => err
401:                 frames = filter_backtrace( err.backtrace )
402:                 self.log.error "%s loaded, but failed to initialize: %s" % [
403:                     appletclass.normalized_name,
404:                     err.message,
405:                 ]
406:                 self.log.debug "  " + frames.collect {|frame| "[%s]" % frame }.join("  ")
407:                 @filemap[ path ].exception = err
408:             end
409:         end
410:             
411:     end
purge_deleted_applets( *missing_files ) click to toggle source

Remove the applets that were loaded from the given missing_files from the registry.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 349
349:     def purge_deleted_applets( *missing_files )
350: 
351:         # For each filename, find the applets which were loaded from it, 
352:         # map the name of each applet to a uri via the classmap, and delete
353:         # the entries by uri
354:         missing_files.flatten.each do |filename|
355:             self.log.info "Unregistering old applets from %p" % [ filename ]
356: 
357:             @filemap[ filename ].uris.each do |uri|
358:                 self.log.debug "  Removing %p, registered at %p" % [ @urispace[uri], uri ]
359:                 @urispace.delete( uri )
360:             end
361:             
362:             @filemap.delete( filename )
363:         end
364:     end
register_applet_class( klass ) click to toggle source

Register an instance of the given klass with the broker if the classmap includes it, returning the URIs which were mapped to instances of the klass.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 417
417:     def register_applet_class( klass )
418:         uris = []
419: 
420:         # Trim the Module serving as private namespace from the
421:         # class name
422:         appletname = klass.normalized_name
423:         self.log.debug "Registering %p applet as %p" % [ klass.name, appletname ]
424: 
425:         # Look for a uri corresponding to the loaded class, and instantiate it
426:         # if there is one.
427:         if @classmap.key?( appletname )
428:             self.log.debug "  Found one or more uris for '%s'" % appletname
429:             
430: 
431:             # Create a new instance of the applet for each uri it's
432:             # registered under, then wrap that in a RegistryEntry
433:             # and put it in the entries hash we'll return later.
434:             @classmap[ appletname ].each do |uri|
435:                 @urispace[ uri ] = klass.new( @config, @template_factory, uri )
436:                 uris << uri
437:             end
438:         else
439:             self.log.debug "No uri for '%s': Not instantiated" % appletname
440:         end
441:         
442:         return uris
443:     end

secsequence

--- SEC00019

seccomment

--- ""

classlist

--- |
Class <a href="AppletRegistry/AppletFile.html" class="link">Arrow::AppletRegistry::AppletFile</a><br />

attributes

--- 
- name: config
  rw: R
  a_desc: |+
    
    The <a href="Config.html">Arrow::Config</a> object which specified the
    registry&#8216;s behavior.
    
- name: filemap
  rw: R
  a_desc: |+
    
    The internal hash of Entry objects keyed by the file they were loaded from
    
- name: urispace
  rw: R
  a_desc: |+
    
    The internal hash of Entry objects, keyed by URI
    

method_list

--- 
- methods: 
  - visibility: public
    aref: M000386
    name: new
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 210</span>\n\
      210:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span> )\n\
      211:         <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\
      212:     \n\
      213:         <span class=\"ruby-ivar\">@classmap</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
      214:         <span class=\"ruby-ivar\">@filemap</span> = {}\n\
      215:         <span class=\"ruby-ivar\">@urispace</span> = {}\n\
      216:         <span class=\"ruby-ivar\">@template_factory</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">TemplateFactory</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">config</span> )\n\
      217:         \n\
      218:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_applets</span>\n\
      219:         <span class=\"ruby-keyword kw\">super</span>()\n\
      220:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Create a <a href="AppletRegistry.html#M000386">new</a> <a
      href="AppletRegistry.html">Arrow::AppletRegistry</a> object.
      </p>
    params: ( config )
  category: Class
  type: Public
- methods: 
  - visibility: public
    aref: M000390
    name: check_for_updates
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 329</span>\n\
      329:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">check_for_updates</span>\n\
      330:         <span class=\"ruby-identifier\">interval</span> = <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">pollInterval</span>\n\
      331:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">interval</span>.<span class=\"ruby-identifier\">nonzero?</span>\n\
      332:             <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-ivar\">@loadTime</span> <span class=\"ruby-operator\">&gt;</span> <span class=\"ruby-identifier\">interval</span>\n\
      333:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Checking for applet updates: poll interval at %ds&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">interval</span>\n\
      334:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">reload_applets</span>\n\
      335:             <span class=\"ruby-keyword kw\">end</span>\n\
      336:         <span class=\"ruby-keyword kw\">else</span>\n\
      337:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Dynamic applet reloading turned off, continuing&quot;</span>\n\
      338:         <span class=\"ruby-keyword kw\">end</span>\n\
      339:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Check the applets path for new/updated/deleted applets if the poll interval
      has passed.
      </p>
    params: ()
  - visibility: public
    aref: M000387
    name: find_applet_chain
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 257</span>\n\
      257:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">find_applet_chain</span>( <span class=\"ruby-identifier\">uri</span> )\n\
      258:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Searching urispace %p for appletchain for %p&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      259:           [<span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">keys</span>.<span class=\"ruby-identifier\">sort</span>, <span class=\"ruby-identifier\">uri</span>]\n\
      260: \n\
      261:         <span class=\"ruby-identifier\">uri_parts</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">sub</span>(<span class=\"ruby-regexp re\">%r{^/(?=.)}</span>, <span class=\"ruby-value str\">''</span>).<span class=\"ruby-identifier\">split</span>(<span class=\"ruby-regexp re\">%r{/}</span>).<span class=\"ruby-identifier\">grep</span>( <span class=\"ruby-constant\">IDENTIFIER</span> )\n\
      262:         <span class=\"ruby-identifier\">appletchain</span> = []\n\
      263:         <span class=\"ruby-identifier\">args</span> = []\n\
      264: \n\
      265:         <span class=\"ruby-comment cmt\"># If there's an applet installed at the base, prepend it to the</span>\n\
      266:         <span class=\"ruby-comment cmt\"># appletchain</span>\n\
      267:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-value str\">&quot;&quot;</span> )\n\
      268:             <span class=\"ruby-identifier\">appletchain</span> <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-constant\">ChainLink</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-value str\">&quot;&quot;</span>], <span class=\"ruby-value str\">&quot;&quot;</span>, <span class=\"ruby-identifier\">uri_parts</span> )\n\
      269:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Added base applet to chain.&quot;</span>\n\
      270:         <span class=\"ruby-keyword kw\">end</span>\n\
      271: \n\
      272:         <span class=\"ruby-comment cmt\"># Only allow reference to internal handlers (handlers mapped to </span>\n\
      273:         <span class=\"ruby-comment cmt\"># directories that start with '_') if allow_internal is set.</span>\n\
      274:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Split URI into parts: %p&quot;</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">uri_parts</span>]\n\
      275: \n\
      276:         <span class=\"ruby-comment cmt\"># Map uri fragments onto registry entries, stopping at any element </span>\n\
      277:         <span class=\"ruby-comment cmt\"># which isn't a valid Ruby identifier.</span>\n\
      278:         <span class=\"ruby-identifier\">uri_parts</span>.<span class=\"ruby-identifier\">each_index</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">|</span>\n\
      279:             <span class=\"ruby-identifier\">newuri</span> = <span class=\"ruby-identifier\">uri_parts</span>[<span class=\"ruby-value\">0</span>,<span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">+</span><span class=\"ruby-value\">1</span>].<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">&quot;/&quot;</span>)\n\
      280:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Testing %s against %p&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">newuri</span>, <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">keys</span>.<span class=\"ruby-identifier\">sort</span> ]\n\
      281:             <span class=\"ruby-identifier\">appletchain</span> <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-constant\">ChainLink</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-identifier\">newuri</span>], <span class=\"ruby-identifier\">newuri</span>, <span class=\"ruby-identifier\">uri_parts</span>[(<span class=\"ruby-identifier\">i</span><span class=\"ruby-operator\">+</span><span class=\"ruby-value\">1</span>)<span class=\"ruby-operator\">..</span><span class=\"ruby-value\">-1</span>] ) <span class=\"ruby-keyword kw\">if</span>\n\
      282:                 <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">newuri</span> )\n\
      283:         <span class=\"ruby-keyword kw\">end</span>\n\
      284: \n\
      285:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">appletchain</span>\n\
      286:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Find the chain of applets indicated by the given <tt>uri</tt> and return an
      Array of ChainLink structs.
      </p>
    params: ( uri )
  - visibility: public
    aref: M000388
    name: load_applets
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 303</span>\n\
      303:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_applets</span>\n\
      304:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Loading applet registry&quot;</span>\n\
      305: \n\
      306:         <span class=\"ruby-ivar\">@classmap</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">build_classmap</span>\n\
      307:         <span class=\"ruby-identifier\">filelist</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">find_appletfiles</span>\n\
      308: \n\
      309:         <span class=\"ruby-comment cmt\"># Remove applet files which correspond to files that are no longer</span>\n\
      310:         <span class=\"ruby-comment cmt\"># in the list</span>\n\
      311:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">keys</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">filelist</span> ) <span class=\"ruby-keyword kw\">unless</span> \n\
      312:             <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">empty?</span>\n\
      313: \n\
      314:         <span class=\"ruby-comment cmt\"># Now search the applet path for applet files</span>\n\
      315:         <span class=\"ruby-identifier\">filelist</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">appletfile</span><span class=\"ruby-operator\">|</span>\n\
      316:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Found applet file %p&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletfile</span>\n\
      317:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_applets_from_file</span>( <span class=\"ruby-identifier\">appletfile</span> )\n\
      318:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;After %s, registry has %d entries&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      319:                 [ <span class=\"ruby-identifier\">appletfile</span>, <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">length</span> ]\n\
      320:         <span class=\"ruby-keyword kw\">end</span>\n\
      321: \n\
      322:         <span class=\"ruby-ivar\">@loadTime</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>\n\
      323:     <span class=\"ruby-keyword kw\">end</span>"
    aka: 
    - aref: AppletRegistry.html#M000389
      name: reload_applets
    m_desc: |-
      <p>
      Load any <a href="AppletRegistry.html#M000386">new</a> applets in the
      registry&#8216;s path, reload any previously- loaded applets whose files
      have changed, and discard any applets whose files have disappeared.
      </p>
    params: ()
  - visibility: public
    aref: M000389
    name: reload_applets
    m_desc: |-
      <p>
      Alias for <a href="AppletRegistry.html#M000388">#load_applets</a>
      </p>
    params: ()
  category: Instance
  type: Public
- methods: 
  - visibility: protected
    aref: M000394
    name: build_classmap
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 449</span>\n\
      449:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">build_classmap</span>\n\
      450:         <span class=\"ruby-identifier\">classmap</span> = <span class=\"ruby-constant\">Hash</span>.<span class=\"ruby-identifier\">new</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">ary</span>,<span class=\"ruby-identifier\">k</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">ary</span>[<span class=\"ruby-identifier\">k</span>] = []}\n\
      451: \n\
      452:         <span class=\"ruby-comment cmt\"># Invert the applet layout into Class =&gt; [ uris ] so as classes</span>\n\
      453:         <span class=\"ruby-comment cmt\"># load, we know where to put 'em.</span>\n\
      454:         <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">layout</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span>, <span class=\"ruby-identifier\">klassname</span><span class=\"ruby-operator\">|</span>\n\
      455:             <span class=\"ruby-identifier\">uri</span> = <span class=\"ruby-identifier\">uri</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">%r{^/}</span>, <span class=\"ruby-value str\">''</span> )\n\
      456:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Mapping %p to %p&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">klassname</span>, <span class=\"ruby-identifier\">uri</span> ]\n\
      457:             <span class=\"ruby-identifier\">classmap</span>[ <span class=\"ruby-identifier\">klassname</span> ] <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-identifier\">uri</span>\n\
      458:         <span class=\"ruby-keyword kw\">end</span>\n\
      459: \n\
      460:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">classmap</span>\n\
      461:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Make and return a Hash which inverts the registry&#8216;s applet layout
      into a map of class name to the URIs onto which instances of them should be
      installed.
      </p>
    params: ()
  - visibility: protected
    aref: M000395
    name: find_appletfiles
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 468</span>\n\
      468:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">find_appletfiles</span>( <span class=\"ruby-identifier\">excludeList</span>=[] )\n\
      469:         <span class=\"ruby-identifier\">files</span> = []\n\
      470:         <span class=\"ruby-identifier\">dirCount</span> = <span class=\"ruby-value\">0</span>\n\
      471: \n\
      472:         <span class=\"ruby-comment cmt\"># For each directory in the configured applets path,</span>\n\
      473:         <span class=\"ruby-comment cmt\"># fully-qualify it and untaint the specified pathname.</span>\n\
      474:         <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">path</span><span class=\"ruby-operator\">|</span>\n\
      475: \n\
      476:             <span class=\"ruby-comment cmt\"># Look for files under a directory</span>\n\
      477:             <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">directory?</span>( <span class=\"ruby-identifier\">path</span> )\n\
      478:                 <span class=\"ruby-identifier\">dirCount</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-value\">1</span>\n\
      479:                 <span class=\"ruby-identifier\">pat</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-identifier\">path</span>, <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">pattern</span> )\n\
      480:                 <span class=\"ruby-identifier\">pat</span>.<span class=\"ruby-identifier\">untaint</span>\n\
      481: \n\
      482:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Looking for applets: %p&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">pat</span>\n\
      483:                 <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-constant\">Dir</span>[ <span class=\"ruby-identifier\">pat</span> ] )\n\
      484:             <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">file?</span>( <span class=\"ruby-identifier\">path</span> )\n\
      485:                 <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">path</span> )\n\
      486:             <span class=\"ruby-keyword kw\">end</span>\n\
      487:         <span class=\"ruby-keyword kw\">end</span>\n\
      488: \n\
      489:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">&quot;Fetched %d applet file paths from %d directories (out of %d)&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      490:             [ <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">nitems</span>, <span class=\"ruby-identifier\">dirCount</span>, <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">applets</span>.<span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">dirs</span>.<span class=\"ruby-identifier\">nitems</span> ]\n\
      491: \n\
      492:         <span class=\"ruby-identifier\">files</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">file</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">untaint</span> }\n\
      493:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">files</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">excludeList</span>\n\
      494:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Find applet files by looking in the applets path of the registry&#8216;s
      configuration for files matching the configured pattern. Return an Array of
      fully-qualified applet files. If the optional <tt>excludeList</tt> is
      given, exclude any files specified from the return value.
      </p>
    params: ( excludeList=[] )
  - visibility: protected
    aref: M000392
    name: load_applets_from_file
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 371</span>\n\
      371:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_applets_from_file</span>( <span class=\"ruby-identifier\">path</span> )\n\
      372: \n\
      373:         <span class=\"ruby-comment cmt\"># Reload mode -- don't do anything unless the file's been updated</span>\n\
      374:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">path</span> )\n\
      375:             <span class=\"ruby-identifier\">file</span> = <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ]\n\
      376:             \n\
      377:             <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">has_changed?</span>\n\
      378:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">&quot;File %p has changed since loaded. Reloading.&quot;</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">path</span>]\n\
      379:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-identifier\">path</span> )\n\
      380:             <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">loaded_okay?</span>\n\
      381:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-value str\">&quot;File %s could not be loaded: %s&quot;</span> <span class=\"ruby-operator\">%</span> \n\
      382:                     [<span class=\"ruby-identifier\">path</span>, <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">exception</span>.<span class=\"ruby-identifier\">message</span>]\n\
      383:                 <span class=\"ruby-identifier\">file</span>.<span class=\"ruby-identifier\">exception</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">frame</span><span class=\"ruby-operator\">|</span>\n\
      384:                     <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;  &quot;</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">frame</span>\n\
      385:                 <span class=\"ruby-keyword kw\">end</span>\n\
      386:             <span class=\"ruby-keyword kw\">else</span>\n\
      387:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;File %p has not changed.&quot;</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">path</span>]\n\
      388:                 <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\
      389:             <span class=\"ruby-keyword kw\">end</span>\n\
      390:         <span class=\"ruby-keyword kw\">end</span>\n\
      391: \n\
      392:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Attempting to load applet objects from %p&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">path</span>\n\
      393:         <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ] = <span class=\"ruby-constant\">AppletFile</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">path</span> )\n\
      394:     \n\
      395:         <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">appletclasses</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">appletclass</span><span class=\"ruby-operator\">|</span>\n\
      396:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Registering applet class %s from %p&quot;</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">appletclass</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">path</span>]\n\
      397:             <span class=\"ruby-keyword kw\">begin</span>\n\
      398:                 <span class=\"ruby-identifier\">uris</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">register_applet_class</span>( <span class=\"ruby-identifier\">appletclass</span> )\n\
      399:                 <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">uris</span> <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-identifier\">uris</span>\n\
      400:             <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Exception</span> =<span class=\"ruby-operator\">&gt;</span> <span class=\"ruby-identifier\">err</span>\n\
      401:                 <span class=\"ruby-identifier\">frames</span> = <span class=\"ruby-identifier\">filter_backtrace</span>( <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span> )\n\
      402:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">&quot;%s loaded, but failed to initialize: %s&quot;</span> <span class=\"ruby-operator\">%</span> [\n\
      403:                     <span class=\"ruby-identifier\">appletclass</span>.<span class=\"ruby-identifier\">normalized_name</span>,\n\
      404:                     <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>,\n\
      405:                 ]\n\
      406:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;  &quot;</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">frames</span>.<span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">frame</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-value str\">&quot;[%s]&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">frame</span> }.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">&quot;  &quot;</span>)\n\
      407:                 <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">path</span> ].<span class=\"ruby-identifier\">exception</span> = <span class=\"ruby-identifier\">err</span>\n\
      408:             <span class=\"ruby-keyword kw\">end</span>\n\
      409:         <span class=\"ruby-keyword kw\">end</span>\n\
      410:             \n\
      411:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Load the applet classes from the given <tt>path</tt> and return them in an
      Array. If a block is given, then each loaded class is yielded to the block
      in turn, and the return values are used in the Array instead.
      </p>
    params: ( path )
  - visibility: protected
    aref: M000391
    name: purge_deleted_applets
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 349</span>\n\
      349:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">purge_deleted_applets</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">missing_files</span> )\n\
      350: \n\
      351:         <span class=\"ruby-comment cmt\"># For each filename, find the applets which were loaded from it, </span>\n\
      352:         <span class=\"ruby-comment cmt\"># map the name of each applet to a uri via the classmap, and delete</span>\n\
      353:         <span class=\"ruby-comment cmt\"># the entries by uri</span>\n\
      354:         <span class=\"ruby-identifier\">missing_files</span>.<span class=\"ruby-identifier\">flatten</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">filename</span><span class=\"ruby-operator\">|</span>\n\
      355:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">&quot;Unregistering old applets from %p&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">filename</span> ]\n\
      356: \n\
      357:             <span class=\"ruby-ivar\">@filemap</span>[ <span class=\"ruby-identifier\">filename</span> ].<span class=\"ruby-identifier\">uris</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span><span class=\"ruby-operator\">|</span>\n\
      358:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;  Removing %p, registered at %p&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-ivar\">@urispace</span>[<span class=\"ruby-identifier\">uri</span>], <span class=\"ruby-identifier\">uri</span> ]\n\
      359:                 <span class=\"ruby-ivar\">@urispace</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">uri</span> )\n\
      360:             <span class=\"ruby-keyword kw\">end</span>\n\
      361:             \n\
      362:             <span class=\"ruby-ivar\">@filemap</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">filename</span> )\n\
      363:         <span class=\"ruby-keyword kw\">end</span>\n\
      364:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Remove the applets that were loaded from the given <tt>missing_files</tt>
      from the registry.
      </p>
    params: ( *missing_files )
  - visibility: protected
    aref: M000393
    name: register_applet_class
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/appletregistry.rb, line 417</span>\n\
      417:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">register_applet_class</span>( <span class=\"ruby-identifier\">klass</span> )\n\
      418:         <span class=\"ruby-identifier\">uris</span> = []\n\
      419: \n\
      420:         <span class=\"ruby-comment cmt\"># Trim the Module serving as private namespace from the</span>\n\
      421:         <span class=\"ruby-comment cmt\"># class name</span>\n\
      422:         <span class=\"ruby-identifier\">appletname</span> = <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">normalized_name</span>\n\
      423:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;Registering %p applet as %p&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">appletname</span> ]\n\
      424: \n\
      425:         <span class=\"ruby-comment cmt\"># Look for a uri corresponding to the loaded class, and instantiate it</span>\n\
      426:         <span class=\"ruby-comment cmt\"># if there is one.</span>\n\
      427:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@classmap</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">appletname</span> )\n\
      428:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;  Found one or more uris for '%s'&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletname</span>\n\
      429:             \n\
      430: \n\
      431:             <span class=\"ruby-comment cmt\"># Create a new instance of the applet for each uri it's</span>\n\
      432:             <span class=\"ruby-comment cmt\"># registered under, then wrap that in a RegistryEntry</span>\n\
      433:             <span class=\"ruby-comment cmt\"># and put it in the entries hash we'll return later.</span>\n\
      434:             <span class=\"ruby-ivar\">@classmap</span>[ <span class=\"ruby-identifier\">appletname</span> ].<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">uri</span><span class=\"ruby-operator\">|</span>\n\
      435:                 <span class=\"ruby-ivar\">@urispace</span>[ <span class=\"ruby-identifier\">uri</span> ] = <span class=\"ruby-identifier\">klass</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@config</span>, <span class=\"ruby-ivar\">@template_factory</span>, <span class=\"ruby-identifier\">uri</span> )\n\
      436:                 <span class=\"ruby-identifier\">uris</span> <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-identifier\">uri</span>\n\
      437:             <span class=\"ruby-keyword kw\">end</span>\n\
      438:         <span class=\"ruby-keyword kw\">else</span>\n\
      439:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">&quot;No uri for '%s': Not instantiated&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">appletname</span>\n\
      440:         <span class=\"ruby-keyword kw\">end</span>\n\
      441:         \n\
      442:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">uris</span>\n\
      443:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Register an instance of the given <tt>klass</tt> with the broker if the
      classmap includes it, returning the URIs which were mapped to instances of
      the <tt>klass</tt>.
      </p>
    params: ( klass )
  category: Instance
  type: Protected

sectitle

--- 

constants

--- 
- name: SVNRev
  desc: |+
    
    SVN Revision
    
  value: "%q$Rev: 437 $"
- name: SVNId
  desc: |+
    
    SVN Id
    
  value: "%q$Id: appletregistry.rb 437 2008-03-28 00:49:20Z deveiant $"
- name: IDENTIFIER
  desc: |+
    
    Pattern for matching valid components of the uri
    
  value: /^\w[-\w]*/
- name: ChainLink
  desc: |+
    
    Link in an applet chain
    
  value: Struct.new( 'ArrowAppletChainLink', :applet, :path, :args )

[Validate]

Generated with the Darkfish Rdoc Generator.