Subversion Info

Rev
439
Last Checked In
2008-04-10 23:27:34 (6 days ago)
Checked in by
deveiant

Parent

Namespace

Class Index

Quicksearch

Arrow::Applet

An abstract base class for Arrow applets. Provides execution logic, argument-parsing/untainting/validation, and templating through an injected factory.

Constants

SVNRev
SVN Revision
SVNId
SVN Id
SignatureStruct
Applet signature struct. The fields are as follows:
name
The name of the applet; used for introspection and reports.
description
The description of the applet; used for introspection.
maintainer
The name of the maintainer for reports and introspection.
version
The version or revision number of the applet, which can be any object that has a #to_s method.
default_action
The action that will be run if no action is specified.
templates
A hash of templates used by the applet. The keys are Symbol identifiers which will be used for lookup, and the values are the paths to template files.
validator_profiles
A hash containing profiles for the built in form validator, one per action. See the documentation for FormValidator for the format of each profile hash.
SignatureStructDefaults
Default-generators for Signatures which are missing one or more of the optional pairs.

Attributes

actions[R]
The list of all valid actions on the applet
config[RW]
The Arrow::Config object which contains the system‘s configuration.
derivatives[R]
The Array of loaded applet classes (derivatives)
filename[RW]
The file containing the applet‘s class definition
newly_loaded[R]
The Array of applet classes that were loaded by the most recent call to .load.
run_count[R]
The number of times this particular applet object has been run
signature[R]
The Struct that contains the configuration values for this applet
template_factory[R]
The Arrow::TemplateFactory object used to load templates for the applet.
total_stime[R]
The number of system seconds spent in this applet‘s #run method.
total_utime[R]
The number of user seconds spent in this applet‘s #run method.
uri[R]
The URI the applet answers to

Public Class Methods

appicon( imgfile ) click to toggle source

Set the appicon for the applet to imgfile.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 268
268:     def self::appicon( imgfile )
269:         self.signature.appicon = imgfile
270:     end
applet_description( desc ) click to toggle source

Set the description of the applet to desc.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 237
237:     def self::applet_description( desc )
238:         self.signature.description = desc     
239:     end
applet_maintainer( info ) click to toggle source

Set the contact information for the maintainer of the applet to info.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 243
243:     def self::applet_maintainer( info )
244:         self.signature.maintainer = info
245:     end
applet_name( name ) click to toggle source

Set the name of the applet to name.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 231
231:     def self::applet_name( name )
232:         self.signature.name = name
233:     end
applet_version( ver ) click to toggle source

Set the contact information for the maintainer of the applet to info.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 249
249:     def self::applet_version( ver )
250:         self.signature.version = ver
251:     end
def_action( name, &block ) click to toggle source

Define an action for the applet. Transactions which include the specified name as the first directory of the uri after the one the applet is assigned to will be passed to the given block. The return value from this method is an Arrow::Applet::SigProxy which can be used to set associated values in the applet‘s Signature; see the Synopsis in lib/arrow/applet.rb for examples of how to use this.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 409
409:     def self::def_action( name, &block )
410:         name = '_default' if name.to_s.empty?
411:         
412:         # Action must accept at least a transaction argument
413:         unless block.arity.nonzero?
414:             raise ScriptError,
415:                 "Malformed action #{name}: must accept at least one argument"
416:         end
417: 
418:         methodName = "#{name}_action"
419:         define_method( methodName, &block )
420:         SigProxy.new( name, self )
421:     end
default_action( action ) click to toggle source

Set the default action for the applet to action.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 255
255:     def self::default_action( action )
256:         self.signature.default_action = action.to_s
257:     end
inherited( klass ) click to toggle source

Inheritance callback: register any derivative classes so they can be looked up later.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 275
275:     def self::inherited( klass )
276:         @inherited_from = true
277:         if defined?( @newly_loaded )
278:             @newly_loaded.push( klass )
279:             super
280:         else
281:             Arrow::Applet.inherited( klass )
282:         end
283:     end
inherited_from?() click to toggle source

Have any subclasses of this class been created?

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 287
287:     def self::inherited_from?
288:         @inherited_from
289:     end
load( filename, include_base_classes=false ) click to toggle source

Load any applet classes in the given file and return them. Ignores any class which has a subclass in the file unless include_base_classes is set false

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 305
305:     def self::load( filename, include_base_classes=false )
306:         self.newly_loaded.clear
307: 
308:         # Load the applet file in an anonymous module. Any applet classes get
309:         # collected via the ::inherited hook into @newly_loaded
310:         Kernel.load( filename, true )
311: 
312:         newderivatives = @newly_loaded.dup
313:         @derivatives -= @newly_loaded
314:         @derivatives.push( *@newly_loaded )
315: 
316:         newderivatives.each do |applet|
317:             applet.filename = filename
318:         end
319: 
320:         unless include_base_classes
321:             newderivatives.delete_if do |applet|
322:                 applet.inherited_from?
323:             end
324:         end
325:         
326:         return newderivatives
327:     end
make_signature() click to toggle source

Signature lookup: look for either a constant or an instance variable of the class that contains the raw signature hash, and convert it to an Arrow::Applet::SignatureStruct object.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 353
353:     def self::make_signature
354:         rawsig = nil
355:         if self.instance_variables.include?( "@signature" )
356:             rawsig = self.instance_variable_get( :@signature )
357:         elsif self.constants.include?( "Signature" )
358:             rawsig = self.const_get( :Signature )
359:         elsif self.constants.include?( "SIGNATURE" )
360:             rawsig = self.const_get( :SIGNATURE )
361:         else
362:             rawsig = {}
363:         end
364: 
365:         # Backward-compatibility: Rewrite the 'vargs' member as
366:         # 'validator_profiles' if 'vargs' exists and 'validator_profiles'
367:         # doesn't. 'vargs' member will be deleted regardless.
368:         rawsig[ :validator_profiles ] ||= rawsig.delete( :vargs ) if
369:             rawsig.key?( :vargs )
370: 
371:         # If the superclass has a signature, inherit values from it for
372:         # pairs that are missing.
373:         if self.superclass < Arrow::Applet && self.superclass.signature?
374:             self.superclass.signature.each_pair do |member,value|
375:                 next if [:name, :description, :version].include?( member )
376:                 if rawsig[member].nil?
377:                     rawsig[ member ] = value.dup rescue value
378:                 end
379:             end
380:         end
381: 
382:         # Apply sensible defaults for members that aren't defined
383:         SignatureStructDefaults.each do |key,val|
384:             next if rawsig[ key ]
385:             case val
386:             when Proc, Method
387:                 rawsig[ key ] = val.call( rawsig, self )
388:             when Numeric, NilClass, FalseClass, TrueClass
389:                 rawsig[ key ] = val
390:             else
391:                 rawsig[ key ] = val.dup
392:             end
393:         end
394: 
395:         # Signature = Struct.new( :name, :description, :maintainer,
396:         #     :version, :config, :default_action, :templates, :validatorArgs,
397:         #     :monitors )
398:         members = SignatureStruct.members.collect {|m| m.intern}
399:         return SignatureStruct.new( *rawsig.values_at(*members) )
400:     end
method_added( sym ) click to toggle source

Method definition callback: Check newly-defined action methods for appropriate arity.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 294
294:     def self::method_added( sym )
295:         if /^(\w+)_action$/.match( sym.to_s ) &&
296:                 self.instance_method( sym ).arity.zero?
297:             raise ScriptError, "Inappropriate arity for #{sym}", caller(1)
298:         end
299:     end
new( config, template_factory, uri ) click to toggle source

Create a new Arrow::Applet object with the specified config (an Arrow::Config object), template_factory (an Arrow::TemplateFactory object), and the uri the applet will live under in the appserver (a String).

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 436
436:     def initialize( config, template_factory, uri )
437:         @config               = config
438:         @template_factory = template_factory
439:         @uri              = uri
440: 
441:         @signature            = self.class.signature.dup
442:         @run_count            = 0
443:         @total_utime      = 0
444:         @total_stime      = 0
445: 
446:         # Make a regexp out of all public <something>_action methods
447:         @actions = self.public_methods( true ).
448:             select {|meth| /^(\w+)_action$/ =~ meth }.
449:             collect {|meth| meth.gsub(/_action/, '') }
450:         @actions_regexp   = Regexp.new( "^(" + actions.join( '|' ) + ")$" )
451:     end
normalized_name() click to toggle source

Return the name of the applet class after stripping off any namespace-safe prefixes.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 332
332:     def self::normalized_name
333:         self.name.sub( /#<Module:0x\w+>::/, '' )
334:     end
signature() click to toggle source

Get the applet‘s signature (an Arrow::Applet::SignatureStruct object).

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 339
339:     def self::signature
340:         @signature ||= make_signature()
341:     end
signature?() click to toggle source

Returns true if the applet class has a signature.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 345
345:     def self::signature?
346:         !self.signature.nil?
347:     end
template( sym, path=nil ) click to toggle source

Set the path for the template specified by sym to path.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 212
212:     def self::template( sym, path=nil )
213:         case sym
214:         when Symbol, String
215:             self.signature.templates[ sym ] = path
216:             
217:         when Hash
218:             self.signature.templates.merge!( sym )
219:             
220:         else
221:             raise ArgumentError, "cannot convert %s to Symbol" % [ sym ]
222:         end
223:     end
validator( action, rules={} ) click to toggle source

Set the validator rules for the specified action.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 262
262:     def self::validator( action, rules={} )
263:         self.signature.validator_profiles[ action ] = rules
264:     end

Public Instance Methods

action_missing_action( txn, raction, *args ) click to toggle source

The action invoked if the specified action is not explicitly defined. The default implementation will look for a template with the same key as the action, and if found, will load that and return it.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 574
574:     def action_missing_action( txn, raction, *args )
575:         self.log.debug "In action_missing_action with: raction = %p, args = %p" %
576:             [ raction, args ]
577: 
578:         if raction && @signature.templates.key?( raction.to_s.intern )
579:             self.log.debug "Using template sender default action for %s" % raction
580:             txn.vargs = self.make_validator( raction, txn )
581:             tmpl = self.load_template( raction.intern )
582:             tmpl.txn = txn
583:             return tmpl
584:         else
585:             raise Arrow::AppletError, "No such action '%s' in %s" %
586:                 [ raction, self.signature.name ]
587:         end
588:     end
average_usage() click to toggle source

Returns the average number of seconds (user + system) per run.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 604
604:     def average_usage
605:         return 0.0 if @run_count.zero?
606:         (@total_utime + @total_stime) / @run_count.to_f
607:     end
chainable?() click to toggle source

Alias for #delegable?

delegable?() click to toggle source

Returns true if the receiver has a #delegate method that is inherited from somewhere other than the base Arrow::Applet class.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 565
565:     def delegable?
566:         return self.method(:delegate).to_s !~ /\(Arrow::Applet\)/
567:     end
Also aliased as: chainable?
delegate( txn, chain, *args ) {|chain| ...} click to toggle source

Wrapper method for a delegation (chained) request.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 558
558:     def delegate( txn, chain, *args )
559:         yield( chain )
560:     end
inspect() click to toggle source

Return a human-readable String representing the applet.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 592
592:     def inspect
593:         "<%s:0x%08x: %s [%s/%s]>" % [
594:             self.class.name,
595:             self.object_id * 2,
596:             @signature.name,
597:             @signature.version,
598:             @signature.maintainer
599:         ]
600:     end
lookup_action_method( txn, action, *args ) click to toggle source

Given an action name (or nil for the default action), return a Method for the action method which should be invoked on the specified txn.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 537
537:     def lookup_action_method( txn, action, *args )
538:         self.log.debug "Mapping %s( %p ) to an action" % [ action, args ]
539: 
540:         # Look up the Method object that needs to be called
541:         if (( match = @actions_regexp.match(action.to_s) ))
542:             action = match.captures[0]
543:             action.untaint
544:             self.log.debug "Matched action = #{action}"
545:         else
546:             self.log.info "Couldn't find specified action %p. "\
547:                 "Defaulting to the 'action_missing' action." % action
548:             args.unshift( action )
549:             action = "action_missing"
550:         end
551: 
552:         return self.method( "#{action}_action" ), *args
553:     end
run( txn, action=nil, *args ) {|meth, txn, *args| ...} click to toggle source

Run the specified action for the given txn and the specified args.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 485
485:     def run( txn, action=nil, *args )
486:         starttimes = Process.times
487:         self.log.debug "Running %s" % [ self.signature.name ]
488: 
489:         action = nil if action.to_s.empty?
490:         action ||= @signature.default_action or
491:             raise Arrow::AppletError, "Missing default handler '#{default}'"
492: 
493:         # Do any initial preparation of the transaction that can be factored out
494:         # of all the actions.
495:         self.prep_transaction( txn )
496:         meth, *args = self.lookup_action_method( txn, action, *args )
497:         self.log.debug "Action method is: %p" % [meth]
498:         txn.vargs = self.make_validator( action, txn )
499:         
500:         # Now either pass control to the block, if given, or invoke the
501:         # action
502:         if block_given?
503:             self.log.debug "Yielding to passed block"
504:             rval = yield( meth, txn, *args )
505:         else
506:             self.log.debug "Applet action arity: %d; args = %p" %
507:                 [ meth.arity, args ]
508: 
509:             # Invoke the action with the right number of arguments.
510:             if meth.arity < 0
511:                 rval = meth.call( txn, *args )
512:             elsif meth.arity >= 1
513:                 args.unshift( txn )
514:                 until args.length >= meth.arity do args << nil end
515:                 rval = meth.call( *(args[0, meth.arity]) )
516:             else
517:                 raise Arrow::AppletError,
518:                     "Malformed action: Must accept at least a transaction argument"
519:             end
520:         end
521: 
522:         # Calculate CPU times
523:         runtimes = Process.times
524:         @run_count += 1
525:         @total_utime += utime = (runtimes.utime - starttimes.utime)
526:         @total_stime += stime = (runtimes.stime - starttimes.stime)
527:         self.log.info \
528:             "[PID %d] Runcount: %d, User: %0.2f/%0.2f, System: %0.2f/%0.2f" %
529:             [ Process.pid, @run_count, utime, @total_utime, stime, @total_stime ]
530: 
531:         return rval
532:     end

Protected Instance Methods

get_validator_profile_for_action( action, txn ) click to toggle source

Return the validator profile that corresponds to the action which will be executed by the specified txn. Returns the default profile if no more-specific one is available.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 661
661:     def get_validator_profile_for_action( action, txn )
662:         if action.to_s =~ /^(\w+)$/
663:             action = $1
664:             action.untaint
665:         else
666:             self.log.warning "Invalid action '#{action.inspect}'"
667:             action = :__default__
668:         end
669:         
670:         # Look up the profile for the applet or the default one
671:         profile = @signature.validator_profiles[ action.to_sym ] ||
672:             @signature.validator_profiles[ :__default__ ]
673: 
674:         if profile.nil?
675:             self.log.warning "No validator for #{action}, and no __default__. "\
676:                 "Returning nil validator."
677:             return nil
678:         end
679: 
680:         return profile
681:     end
load_template( key ) click to toggle source

Load and return the template associated with the given key according to the applet‘s signature. Returns nil if no such template exists.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 644
644:     def load_template( key )
645:         
646:         tname = @signature.templates[key] or
647:             raise Arrow::AppletError, 
648:                 "No such template %p defined in the signature for %s (%s)" %
649:                 [ key, self.signature.name, self.class.filename ]
650: 
651:         tname.untaint
652: 
653:         return @template_factory.get_template( tname )
654:     end
Also aliased as: template
make_validator( action, txn ) click to toggle source

Create a FormValidator object for the specified action which has been given the arguments from the given txn.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 686
686:     def make_validator( action, txn )
687:         profile = self.get_validator_profile_for_action( action, txn ) or
688:             return nil
689: 
690:         # Create a new validator object, map the request args into a regular
691:         # hash, and then send them to the validaator with the applicable profile
692:         self.log.debug "Creating form validator for profile: %p" % profile
693: 
694:         params = {}
695: 
696:         # Only try to parse form parameters if there's a form
697:         if txn.form_request?
698:             txn.request.paramtable.each do |key,val|
699:                 # Multi-valued vs. single params
700:                 params[key] = val.to_a.length > 1 ? val.to_a : val.to_s
701:             end
702:         end
703:         validator = Arrow::FormValidator.new( profile, params )
704: 
705:         self.log.debug "Validator: %p" % validator
706:         return validator
707:     end
prep_transaction( txn ) click to toggle source

Prepares the transaction (txn) for applet execution. By default, this method sets the content type of the response to ‘text/html’ and turns off buffering for the header.

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 636
636:     def prep_transaction( txn )
637:         txn.request.content_type = "text/html"
638:         txn.request.sync_header = true
639:     end
subrun( action, txn, *args ) click to toggle source

Run an action with a duped transaction (e.g., from another action)

     # File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 615
615:     def subrun( action, txn, *args )
616:         action, txn = txn, action if action.is_a?( Arrow::Transaction )
617:         self.log.debug "Running subordinate action '%s' from '%s'" %
618:             [ action, caller[0] ]
619: 
620:         # Make sure the transaction has stuff loaded. This is necessary when
621:         # #subrun is called without going through #run first (e.g., via 
622:         # #delegate)
623:         if txn.vargs.nil?
624:             self.prep_transaction( txn )
625:             txn.vargs = self.make_validator( action, txn )
626:         end
627: 
628:         meth, *args = self.lookup_action_method( txn, action, *args )
629:         return meth.call( txn, *args )
630:     end
template( key ) click to toggle source

Alias for #load_template

secsequence

--- SEC00016

seccomment

--- ""

classlist

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

attributes

--- 
- name: actions
  rw: R
  a_desc: |+
    
    The list of all valid actions on the applet
    
- name: config
  rw: RW
  a_desc: |+
    
    The <a href="Config.html">Arrow::Config</a> object which contains the
    system&#8216;s configuration.
    
- name: derivatives
  rw: R
  a_desc: |+
    
    The Array of loaded applet classes (derivatives)
    
- name: filename
  rw: RW
  a_desc: |+
    
    The file containing the applet&#8216;s class definition
    
- name: newly_loaded
  rw: R
  a_desc: |+
    
    The Array of applet classes that were loaded by the most recent call to .<a
    href="Applet.html#M000563">load</a>.
    
- name: run_count
  rw: R
  a_desc: |+
    
    The number of times this particular applet object has been <a
    href="Applet.html#M000570">run</a>
    
- name: signature
  rw: R
  a_desc: |+
    
    The Struct that contains the configuration values for this applet
    
- name: template_factory
  rw: R
  a_desc: |+
    
    The <a href="TemplateFactory.html">Arrow::TemplateFactory</a> object used
    to <a href="Applet.html#M000563">load</a> templates for the applet.
    
- name: total_stime
  rw: R
  a_desc: |+
    
    The number of system seconds spent in this applet&#8216;s <a
    href="Applet.html#M000570">#run</a> method.
    
- name: total_utime
  rw: R
  a_desc: |+
    
    The number of user seconds spent in this applet&#8216;s <a
    href="Applet.html#M000570">#run</a> method.
    
- name: uri
  rw: R
  a_desc: |+
    
    The URI the applet answers to
    

method_list

--- 
- methods: 
  - visibility: public
    aref: M000559
    name: appicon
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 268</span>\n\
      268:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">appicon</span>( <span class=\"ruby-identifier\">imgfile</span> )\n\
      269:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">appicon</span> = <span class=\"ruby-identifier\">imgfile</span>\n\
      270:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the <a href="Applet.html#M000559">appicon</a> for the applet to
      <tt>imgfile</tt>.
      </p>
    params: ( imgfile )
  - visibility: public
    aref: M000554
    name: applet_description
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 237</span>\n\
      237:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_description</span>( <span class=\"ruby-identifier\">desc</span> )\n\
      238:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">description</span> = <span class=\"ruby-identifier\">desc</span>     \n\
      239:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the description of the applet to <tt>desc</tt>.
      </p>
    params: ( desc )
  - visibility: public
    aref: M000555
    name: applet_maintainer
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 243</span>\n\
      243:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_maintainer</span>( <span class=\"ruby-identifier\">info</span> )\n\
      244:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">maintainer</span> = <span class=\"ruby-identifier\">info</span>\n\
      245:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the contact information for the maintainer of the applet to
      <tt>info</tt>.
      </p>
    params: ( info )
  - visibility: public
    aref: M000553
    name: applet_name
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 231</span>\n\
      231:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_name</span>( <span class=\"ruby-identifier\">name</span> )\n\
      232:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> = <span class=\"ruby-identifier\">name</span>\n\
      233:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the name of the applet to <tt>name</tt>.
      </p>
    params: ( name )
  - visibility: public
    aref: M000556
    name: applet_version
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 249</span>\n\
      249:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">applet_version</span>( <span class=\"ruby-identifier\">ver</span> )\n\
      250:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">version</span> = <span class=\"ruby-identifier\">ver</span>\n\
      251:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the contact information for the maintainer of the applet to
      <tt>info</tt>.
      </p>
    params: ( ver )
  - visibility: public
    aref: M000568
    name: def_action
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 409</span>\n\
      409:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">def_action</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-operator\">&amp;</span><span class=\"ruby-identifier\">block</span> )\n\
      410:         <span class=\"ruby-identifier\">name</span> = <span class=\"ruby-value str\">'_default'</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">empty?</span>\n\
      411:         \n\
      412:         <span class=\"ruby-comment cmt\"># Action must accept at least a transaction argument</span>\n\
      413:         <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">block</span>.<span class=\"ruby-identifier\">arity</span>.<span class=\"ruby-identifier\">nonzero?</span>\n\
      414:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ScriptError</span>,\n\
      415:                 <span class=\"ruby-node\">&quot;Malformed action #{name}: must accept at least one argument&quot;</span>\n\
      416:         <span class=\"ruby-keyword kw\">end</span>\n\
      417: \n\
      418:         <span class=\"ruby-identifier\">methodName</span> = <span class=\"ruby-node\">&quot;#{name}_action&quot;</span>\n\
      419:         <span class=\"ruby-identifier\">define_method</span>( <span class=\"ruby-identifier\">methodName</span>, <span class=\"ruby-operator\">&amp;</span><span class=\"ruby-identifier\">block</span> )\n\
      420:         <span class=\"ruby-constant\">SigProxy</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-keyword kw\">self</span> )\n\
      421:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Define an action for the applet. Transactions which include the specified
      <tt>name</tt> as the first directory of the uri after the one the applet is
      assigned to will be passed to the given <tt>block</tt>. The return value
      from this method is an <a
      href="Applet/SigProxy.html">Arrow::Applet::SigProxy</a> which can be used
      to set associated values in the applet&#8216;s Signature; see the Synopsis
      in lib/arrow/applet.rb for examples of how to use this.
      </p>
    params: ( name, &amp;block )
  - visibility: public
    aref: M000557
    name: default_action
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 255</span>\n\
      255:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">default_action</span>( <span class=\"ruby-identifier\">action</span> )\n\
      256:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">default_action</span> = <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>\n\
      257:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the default action for the applet to <tt>action</tt>.
      </p>
    params: ( action )
  - visibility: public
    aref: M000560
    name: inherited
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 275</span>\n\
      275:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">inherited</span>( <span class=\"ruby-identifier\">klass</span> )\n\
      276:         <span class=\"ruby-ivar\">@inherited_from</span> = <span class=\"ruby-keyword kw\">true</span>\n\
      277:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">defined?</span>( <span class=\"ruby-ivar\">@newly_loaded</span> )\n\
      278:             <span class=\"ruby-ivar\">@newly_loaded</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">klass</span> )\n\
      279:             <span class=\"ruby-keyword kw\">super</span>\n\
      280:         <span class=\"ruby-keyword kw\">else</span>\n\
      281:             <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Applet</span>.<span class=\"ruby-identifier\">inherited</span>( <span class=\"ruby-identifier\">klass</span> )\n\
      282:         <span class=\"ruby-keyword kw\">end</span>\n\
      283:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Inheritance callback: register any derivative classes so they can be looked
      up later.
      </p>
    params: ( klass )
  - visibility: public
    aref: M000561
    name: inherited_from?
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 287</span>\n\
      287:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">inherited_from?</span>\n\
      288:         <span class=\"ruby-ivar\">@inherited_from</span>\n\
      289:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Have any subclasses of this class been created?
      </p>
    params: ()
  - visibility: public
    aref: M000563
    name: load
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 305</span>\n\
      305:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">filename</span>, <span class=\"ruby-identifier\">include_base_classes</span>=<span class=\"ruby-keyword kw\">false</span> )\n\
      306:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">newly_loaded</span>.<span class=\"ruby-identifier\">clear</span>\n\
      307: \n\
      308:         <span class=\"ruby-comment cmt\"># Load the applet file in an anonymous module. Any applet classes get</span>\n\
      309:         <span class=\"ruby-comment cmt\"># collected via the ::inherited hook into @newly_loaded</span>\n\
      310:         <span class=\"ruby-constant\">Kernel</span>.<span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">filename</span>, <span class=\"ruby-keyword kw\">true</span> )\n\
      311: \n\
      312:         <span class=\"ruby-identifier\">newderivatives</span> = <span class=\"ruby-ivar\">@newly_loaded</span>.<span class=\"ruby-identifier\">dup</span>\n\
      313:         <span class=\"ruby-ivar\">@derivatives</span> <span class=\"ruby-operator\">-=</span> <span class=\"ruby-ivar\">@newly_loaded</span>\n\
      314:         <span class=\"ruby-ivar\">@derivatives</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-ivar\">@newly_loaded</span> )\n\
      315: \n\
      316:         <span class=\"ruby-identifier\">newderivatives</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">applet</span><span class=\"ruby-operator\">|</span>\n\
      317:             <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">filename</span> = <span class=\"ruby-identifier\">filename</span>\n\
      318:         <span class=\"ruby-keyword kw\">end</span>\n\
      319: \n\
      320:         <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">include_base_classes</span>\n\
      321:             <span class=\"ruby-identifier\">newderivatives</span>.<span class=\"ruby-identifier\">delete_if</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">applet</span><span class=\"ruby-operator\">|</span>\n\
      322:                 <span class=\"ruby-identifier\">applet</span>.<span class=\"ruby-identifier\">inherited_from?</span>\n\
      323:             <span class=\"ruby-keyword kw\">end</span>\n\
      324:         <span class=\"ruby-keyword kw\">end</span>\n\
      325:         \n\
      326:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">newderivatives</span>\n\
      327:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Load any applet classes in the given file and return them. Ignores any
      class which has a subclass in the file unless <tt>include_base_classes</tt>
      is set false
      </p>
    params: ( filename, include_base_classes=false )
  - visibility: public
    aref: M000567
    name: make_signature
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 353</span>\n\
      353:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">make_signature</span>\n\
      354:         <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
      355:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_variables</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">&quot;@signature&quot;</span> )\n\
      356:             <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_variable_get</span>( <span class=\"ruby-identifier\">:@signature</span> )\n\
      357:         <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">constants</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">&quot;Signature&quot;</span> )\n\
      358:             <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">const_get</span>( <span class=\"ruby-identifier\">:Signature</span> )\n\
      359:         <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">constants</span>.<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-value str\">&quot;SIGNATURE&quot;</span> )\n\
      360:             <span class=\"ruby-identifier\">rawsig</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">const_get</span>( <span class=\"ruby-identifier\">:SIGNATURE</span> )\n\
      361:         <span class=\"ruby-keyword kw\">else</span>\n\
      362:             <span class=\"ruby-identifier\">rawsig</span> = {}\n\
      363:         <span class=\"ruby-keyword kw\">end</span>\n\
      364: \n\
      365:         <span class=\"ruby-comment cmt\"># Backward-compatibility: Rewrite the 'vargs' member as</span>\n\
      366:         <span class=\"ruby-comment cmt\"># 'validator_profiles' if 'vargs' exists and 'validator_profiles'</span>\n\
      367:         <span class=\"ruby-comment cmt\"># doesn't. 'vargs' member will be deleted regardless.</span>\n\
      368:         <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">:validator_profiles</span> ] <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">:vargs</span> ) <span class=\"ruby-keyword kw\">if</span>\n\
      369:             <span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">:vargs</span> )\n\
      370: \n\
      371:         <span class=\"ruby-comment cmt\"># If the superclass has a signature, inherit values from it for</span>\n\
      372:         <span class=\"ruby-comment cmt\"># pairs that are missing.</span>\n\
      373:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span> <span class=\"ruby-operator\">&lt;</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Applet</span> <span class=\"ruby-operator\">&amp;&amp;</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span>.<span class=\"ruby-identifier\">signature?</span>\n\
      374:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">superclass</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">each_pair</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">member</span>,<span class=\"ruby-identifier\">value</span><span class=\"ruby-operator\">|</span>\n\
      375:                 <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">if</span> [<span class=\"ruby-identifier\">:name</span>, <span class=\"ruby-identifier\">:description</span>, <span class=\"ruby-identifier\">:version</span>].<span class=\"ruby-identifier\">include?</span>( <span class=\"ruby-identifier\">member</span> )\n\
      376:                 <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">rawsig</span>[<span class=\"ruby-identifier\">member</span>].<span class=\"ruby-identifier\">nil?</span>\n\
      377:                     <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">member</span> ] = <span class=\"ruby-identifier\">value</span>.<span class=\"ruby-identifier\">dup</span> <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-identifier\">value</span>\n\
      378:                 <span class=\"ruby-keyword kw\">end</span>\n\
      379:             <span class=\"ruby-keyword kw\">end</span>\n\
      380:         <span class=\"ruby-keyword kw\">end</span>\n\
      381: \n\
      382:         <span class=\"ruby-comment cmt\"># Apply sensible defaults for members that aren't defined</span>\n\
      383:         <span class=\"ruby-constant\">SignatureStructDefaults</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>,<span class=\"ruby-identifier\">val</span><span class=\"ruby-operator\">|</span>\n\
      384:             <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ]\n\
      385:             <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">val</span>\n\
      386:             <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Proc</span>, <span class=\"ruby-constant\">Method</span>\n\
      387:                 <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">rawsig</span>, <span class=\"ruby-keyword kw\">self</span> )\n\
      388:             <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Numeric</span>, <span class=\"ruby-constant\">NilClass</span>, <span class=\"ruby-constant\">FalseClass</span>, <span class=\"ruby-constant\">TrueClass</span>\n\
      389:                 <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>\n\
      390:             <span class=\"ruby-keyword kw\">else</span>\n\
      391:                 <span class=\"ruby-identifier\">rawsig</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">dup</span>\n\
      392:             <span class=\"ruby-keyword kw\">end</span>\n\
      393:         <span class=\"ruby-keyword kw\">end</span>\n\
      394: \n\
      395:         <span class=\"ruby-comment cmt\"># Signature = Struct.new( :name, :description, :maintainer,</span>\n\
      396:         <span class=\"ruby-comment cmt\">#     :version, :config, :default_action, :templates, :validatorArgs,</span>\n\
      397:         <span class=\"ruby-comment cmt\">#     :monitors )</span>\n\
      398:         <span class=\"ruby-identifier\">members</span> = <span class=\"ruby-constant\">SignatureStruct</span>.<span class=\"ruby-identifier\">members</span>.<span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">m</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">m</span>.<span class=\"ruby-identifier\">intern</span>}\n\
      399:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">SignatureStruct</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">rawsig</span>.<span class=\"ruby-identifier\">values_at</span>(<span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">members</span>) )\n\
      400:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Signature lookup: look for either a constant or an instance variable of the
      class that contains the raw <a href="Applet.html#M000565">signature</a>
      hash, and convert it to an Arrow::Applet::SignatureStruct object.
      </p>
    params: ()
  - visibility: public
    aref: M000562
    name: method_added
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 294</span>\n\
      294:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">method_added</span>( <span class=\"ruby-identifier\">sym</span> )\n\
      295:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-regexp re\">/^(\\w+)_action$/</span>.<span class=\"ruby-identifier\">match</span>( <span class=\"ruby-identifier\">sym</span>.<span class=\"ruby-identifier\">to_s</span> ) <span class=\"ruby-operator\">&amp;&amp;</span>\n\
      296:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">instance_method</span>( <span class=\"ruby-identifier\">sym</span> ).<span class=\"ruby-identifier\">arity</span>.<span class=\"ruby-identifier\">zero?</span>\n\
      297:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ScriptError</span>, <span class=\"ruby-node\">&quot;Inappropriate arity for #{sym}&quot;</span>, <span class=\"ruby-identifier\">caller</span>(<span class=\"ruby-value\">1</span>)\n\
      298:         <span class=\"ruby-keyword kw\">end</span>\n\
      299:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Method definition callback: Check newly-defined action methods for
      appropriate arity.
      </p>
    params: ( sym )
  - visibility: public
    aref: M000569
    name: new
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 436</span>\n\
      436:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">config</span>, <span class=\"ruby-identifier\">template_factory</span>, <span class=\"ruby-identifier\">uri</span> )\n\
      437:         <span class=\"ruby-ivar\">@config</span>               = <span class=\"ruby-identifier\">config</span>\n\
      438:         <span class=\"ruby-ivar\">@template_factory</span> = <span class=\"ruby-identifier\">template_factory</span>\n\
      439:         <span class=\"ruby-ivar\">@uri</span>              = <span class=\"ruby-identifier\">uri</span>\n\
      440: \n\
      441:         <span class=\"ruby-ivar\">@signature</span>            = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">dup</span>\n\
      442:         <span class=\"ruby-ivar\">@run_count</span>            = <span class=\"ruby-value\">0</span>\n\
      443:         <span class=\"ruby-ivar\">@total_utime</span>      = <span class=\"ruby-value\">0</span>\n\
      444:         <span class=\"ruby-ivar\">@total_stime</span>      = <span class=\"ruby-value\">0</span>\n\
      445: \n\
      446:         <span class=\"ruby-comment cmt\"># Make a regexp out of all public &lt;something&gt;_action methods</span>\n\
      447:         <span class=\"ruby-ivar\">@actions</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">public_methods</span>( <span class=\"ruby-keyword kw\">true</span> ).\n\
      448:             <span class=\"ruby-identifier\">select</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">meth</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-regexp re\">/^(\\w+)_action$/</span> <span class=\"ruby-operator\">=~</span> <span class=\"ruby-identifier\">meth</span> }.\n\
      449:             <span class=\"ruby-identifier\">collect</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">meth</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">gsub</span>(<span class=\"ruby-regexp re\">/_action/</span>, <span class=\"ruby-value str\">''</span>) }\n\
      450:         <span class=\"ruby-ivar\">@actions_regexp</span>   = <span class=\"ruby-constant\">Regexp</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-value str\">&quot;^(&quot;</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">actions</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-value str\">'|'</span> ) <span class=\"ruby-operator\">+</span> <span class=\"ruby-value str\">&quot;)$&quot;</span> )\n\
      451:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Create a <a href="Applet.html#M000569">new</a> <a
      href="Applet.html">Arrow::Applet</a> object with the specified
      <tt>config</tt> (an <a href="Config.html">Arrow::Config</a> object),
      <tt>template_factory</tt> (an <a
      href="TemplateFactory.html">Arrow::TemplateFactory</a> object), and the
      <tt>uri</tt> the applet will live under in the appserver (a String).
      </p>
    params: ( config, template_factory, uri )
  - visibility: public
    aref: M000564
    name: normalized_name
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 332</span>\n\
      332:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">normalized_name</span>\n\
      333:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">/#&lt;Module:0x\\w+&gt;::/</span>, <span class=\"ruby-value str\">''</span> )\n\
      334:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return the name of the applet class after stripping off any namespace-safe
      prefixes.
      </p>
    params: ()
  - visibility: public
    aref: M000565
    name: signature
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 339</span>\n\
      339:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">signature</span>\n\
      340:         <span class=\"ruby-ivar\">@signature</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-identifier\">make_signature</span>()\n\
      341:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Get the applet&#8216;s <a href="Applet.html#M000565">signature</a> (an
      Arrow::Applet::SignatureStruct object).
      </p>
    params: ()
  - visibility: public
    aref: M000566
    name: signature?
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 345</span>\n\
      345:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">signature?</span>\n\
      346:         <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">nil?</span>\n\
      347:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Returns <tt>true</tt> if the applet class has a <a
      href="Applet.html#M000565">signature</a>.
      </p>
    params: ()
  - visibility: public
    aref: M000552
    name: template
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 212</span>\n\
      212:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">template</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-identifier\">path</span>=<span class=\"ruby-keyword kw\">nil</span> )\n\
      213:         <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">sym</span>\n\
      214:         <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Symbol</span>, <span class=\"ruby-constant\">String</span>\n\
      215:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">templates</span>[ <span class=\"ruby-identifier\">sym</span> ] = <span class=\"ruby-identifier\">path</span>\n\
      216:             \n\
      217:         <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Hash</span>\n\
      218:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">merge!</span>( <span class=\"ruby-identifier\">sym</span> )\n\
      219:             \n\
      220:         <span class=\"ruby-keyword kw\">else</span>\n\
      221:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ArgumentError</span>, <span class=\"ruby-value str\">&quot;cannot convert %s to Symbol&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">sym</span> ]\n\
      222:         <span class=\"ruby-keyword kw\">end</span>\n\
      223:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the path for the <a href="Applet.html#M000552">template</a> specified
      by <tt>sym</tt> to <tt>path</tt>.
      </p>
    params: ( sym, path=nil )
  - visibility: public
    aref: M000558
    name: validator
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 262</span>\n\
      262:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">rules</span>={} )\n\
      263:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">action</span> ] = <span class=\"ruby-identifier\">rules</span>\n\
      264:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Set the <a href="Applet.html#M000558">validator</a> <tt>rules</tt> for the
      specified <tt>action</tt>.
      </p>
    params: ( action, rules={} )
  category: Class
  type: Public
- methods: 
  - visibility: public
    aref: M000575
    name: action_missing_action
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 574</span>\n\
      574:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">action_missing_action</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      575:         <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;In action_missing_action with: raction = %p, args = %p&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      576:             [ <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-identifier\">args</span> ]\n\
      577: \n\
      578:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">raction</span> <span class=\"ruby-operator\">&amp;&amp;</span> <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">templates</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">raction</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">intern</span> )\n\
      579:             <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;Using template sender default action for %s&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">raction</span>\n\
      580:             <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-identifier\">txn</span> )\n\
      581:             <span class=\"ruby-identifier\">tmpl</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">load_template</span>( <span class=\"ruby-identifier\">raction</span>.<span class=\"ruby-identifier\">intern</span> )\n\
      582:             <span class=\"ruby-identifier\">tmpl</span>.<span class=\"ruby-identifier\">txn</span> = <span class=\"ruby-identifier\">txn</span>\n\
      583:             <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">tmpl</span>\n\
      584:         <span class=\"ruby-keyword kw\">else</span>\n\
      585:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>, <span class=\"ruby-value str\">&quot;No such action '%s' in %s&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      586:                 [ <span class=\"ruby-identifier\">raction</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> ]\n\
      587:         <span class=\"ruby-keyword kw\">end</span>\n\
      588:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      The action invoked if the specified action is not explicitly defined. The
      default implementation will look for a <a
      href="Applet.html#M000552">template</a> with the same key as the action,
      and if found, will <a href="Applet.html#M000563">load</a> that and return
      it.
      </p>
    params: ( txn, raction, *args )
  - visibility: public
    aref: M000577
    name: average_usage
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 604</span>\n\
      604:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">average_usage</span>\n\
      605:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-value\">0</span><span class=\"ruby-value\">.0</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@run_count</span>.<span class=\"ruby-identifier\">zero?</span>\n\
      606:         (<span class=\"ruby-ivar\">@total_utime</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-ivar\">@total_stime</span>) <span class=\"ruby-operator\">/</span> <span class=\"ruby-ivar\">@run_count</span>.<span class=\"ruby-identifier\">to_f</span>\n\
      607:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Returns the average number of seconds (user + system) per <a
      href="Applet.html#M000570">run</a>.
      </p>
    params: ()
  - visibility: public
    aref: M000574
    name: chainable?
    m_desc: |-
      <p>
      Alias for #delegable?
      </p>
    params: ()
  - visibility: public
    aref: M000573
    name: delegable?
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 565</span>\n\
      565:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">delegable?</span>\n\
      566:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">method</span>(<span class=\"ruby-identifier\">:delegate</span>).<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-operator\">!~</span> <span class=\"ruby-regexp re\">/\\(Arrow::Applet\\)/</span>\n\
      567:     <span class=\"ruby-keyword kw\">end</span>"
    aka: 
    - aref: Applet.html#M000574
      name: chainable?
    m_desc: |-
      <p>
      Returns <tt>true</tt> if the receiver has a <a
      href="Applet.html#M000572">#delegate</a> method that is <a
      href="Applet.html#M000560">inherited</a> from somewhere other than the base
      <a href="Applet.html">Arrow::Applet</a> class.
      </p>
    params: ()
  - visibility: public
    aref: M000572
    name: delegate
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 558</span>\n\
      558:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">delegate</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">chain</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      559:         <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-identifier\">chain</span> )\n\
      560:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Wrapper method for a delegation (chained) request.
      </p>
    params: ( txn, chain, *args ) {|chain| ...}
  - visibility: public
    aref: M000576
    name: inspect
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 592</span>\n\
      592:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">inspect</span>\n\
      593:         <span class=\"ruby-value str\">&quot;&lt;%s:0x%08x: %s [%s/%s]&gt;&quot;</span> <span class=\"ruby-operator\">%</span> [\n\
      594:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>,\n\
      595:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">object_id</span> <span class=\"ruby-operator\">*</span> <span class=\"ruby-value\">2</span>,\n\
      596:             <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">name</span>,\n\
      597:             <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">version</span>,\n\
      598:             <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">maintainer</span>\n\
      599:         ]\n\
      600:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return a human-readable String representing the applet.
      </p>
    params: ()
  - visibility: public
    aref: M000571
    name: lookup_action_method
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 537</span>\n\
      537:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      538:         <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 %s( %p ) to an action&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">args</span> ]\n\
      539: \n\
      540:         <span class=\"ruby-comment cmt\"># Look up the Method object that needs to be called</span>\n\
      541:         <span class=\"ruby-keyword kw\">if</span> (( <span class=\"ruby-identifier\">match</span> = <span class=\"ruby-ivar\">@actions_regexp</span>.<span class=\"ruby-identifier\">match</span>(<span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>) ))\n\
      542:             <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">match</span>.<span class=\"ruby-identifier\">captures</span>[<span class=\"ruby-value\">0</span>]\n\
      543:             <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">untaint</span>\n\
      544:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-node\">&quot;Matched action = #{action}&quot;</span>\n\
      545:         <span class=\"ruby-keyword kw\">else</span>\n\
      546:             <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;Couldn't find specified action %p. &quot;</span>\\\n\
      547:                 <span class=\"ruby-value str\">&quot;Defaulting to the 'action_missing' action.&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">action</span>\n\
      548:             <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">unshift</span>( <span class=\"ruby-identifier\">action</span> )\n\
      549:             <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-value str\">&quot;action_missing&quot;</span>\n\
      550:         <span class=\"ruby-keyword kw\">end</span>\n\
      551: \n\
      552:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">method</span>( <span class=\"ruby-node\">&quot;#{action}_action&quot;</span> ), <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span>\n\
      553:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Given an <tt>action</tt> name (or <tt>nil</tt> for the default action),
      return a Method for the action method which should be invoked on the
      specified <tt>txn</tt>.
      </p>
    params: ( txn, action, *args )
  - visibility: public
    aref: M000570
    name: run
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 485</span>\n\
      485:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">run</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>=<span class=\"ruby-keyword kw\">nil</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      486:         <span class=\"ruby-identifier\">starttimes</span> = <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">times</span>\n\
      487:         <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;Running %s&quot;</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span> ]\n\
      488: \n\
      489:         <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">empty?</span>\n\
      490:         <span class=\"ruby-identifier\">action</span> <span class=\"ruby-operator\">||=</span> <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">default_action</span> <span class=\"ruby-keyword kw\">or</span>\n\
      491:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>, <span class=\"ruby-node\">&quot;Missing default handler '#{default}'&quot;</span>\n\
      492: \n\
      493:         <span class=\"ruby-comment cmt\"># Do any initial preparation of the transaction that can be factored out</span>\n\
      494:         <span class=\"ruby-comment cmt\"># of all the actions.</span>\n\
      495:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\
      496:         <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      497:         <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;Action method is: %p&quot;</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">meth</span>]\n\
      498:         <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\
      499:         \n\
      500:         <span class=\"ruby-comment cmt\"># Now either pass control to the block, if given, or invoke the</span>\n\
      501:         <span class=\"ruby-comment cmt\"># action</span>\n\
      502:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">block_given?</span>\n\
      503:             <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;Yielding to passed block&quot;</span>\n\
      504:             <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      505:         <span class=\"ruby-keyword kw\">else</span>\n\
      506:             <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;Applet action arity: %d; args = %p&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      507:                 [ <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span>, <span class=\"ruby-identifier\">args</span> ]\n\
      508: \n\
      509:             <span class=\"ruby-comment cmt\"># Invoke the action with the right number of arguments.</span>\n\
      510:             <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-operator\">&lt;</span> <span class=\"ruby-value\">0</span>\n\
      511:                 <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      512:             <span class=\"ruby-keyword kw\">elsif</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-operator\">&gt;=</span> <span class=\"ruby-value\">1</span>\n\
      513:                 <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">unshift</span>( <span class=\"ruby-identifier\">txn</span> )\n\
      514:                 <span class=\"ruby-keyword kw\">until</span> <span class=\"ruby-identifier\">args</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">&gt;=</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-identifier\">args</span> <span class=\"ruby-operator\">&lt;&lt;</span> <span class=\"ruby-keyword kw\">nil</span> <span class=\"ruby-keyword kw\">end</span>\n\
      515:                 <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-operator\">*</span>(<span class=\"ruby-identifier\">args</span>[<span class=\"ruby-value\">0</span>, <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">arity</span>]) )\n\
      516:             <span class=\"ruby-keyword kw\">else</span>\n\
      517:                 <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>,\n\
      518:                     <span class=\"ruby-value str\">&quot;Malformed action: Must accept at least a transaction argument&quot;</span>\n\
      519:             <span class=\"ruby-keyword kw\">end</span>\n\
      520:         <span class=\"ruby-keyword kw\">end</span>\n\
      521: \n\
      522:         <span class=\"ruby-comment cmt\"># Calculate CPU times</span>\n\
      523:         <span class=\"ruby-identifier\">runtimes</span> = <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">times</span>\n\
      524:         <span class=\"ruby-ivar\">@run_count</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-value\">1</span>\n\
      525:         <span class=\"ruby-ivar\">@total_utime</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">utime</span> = (<span class=\"ruby-identifier\">runtimes</span>.<span class=\"ruby-identifier\">utime</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">starttimes</span>.<span class=\"ruby-identifier\">utime</span>)\n\
      526:         <span class=\"ruby-ivar\">@total_stime</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">stime</span> = (<span class=\"ruby-identifier\">runtimes</span>.<span class=\"ruby-identifier\">stime</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-identifier\">starttimes</span>.<span class=\"ruby-identifier\">stime</span>)\n\
      527:         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> \\\n\
      528:             <span class=\"ruby-value str\">&quot;[PID %d] Runcount: %d, User: %0.2f/%0.2f, System: %0.2f/%0.2f&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      529:             [ <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">pid</span>, <span class=\"ruby-ivar\">@run_count</span>, <span class=\"ruby-identifier\">utime</span>, <span class=\"ruby-ivar\">@total_utime</span>, <span class=\"ruby-identifier\">stime</span>, <span class=\"ruby-ivar\">@total_stime</span> ]\n\
      530: \n\
      531:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span>\n\
      532:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Run the specified <tt>action</tt> for the given <tt>txn</tt> and the
      specified <tt>args</tt>.
      </p>
    params: ( txn, action=nil, *args ) {|meth, txn, *args| ...}
  category: Instance
  type: Public
- methods: 
  - visibility: protected
    aref: M000582
    name: get_validator_profile_for_action
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 661</span>\n\
      661:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">get_validator_profile_for_action</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\
      662:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-operator\">=~</span> <span class=\"ruby-regexp re\">/^(\\w+)$/</span>\n\
      663:             <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">$1</span>\n\
      664:             <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">untaint</span>\n\
      665:         <span class=\"ruby-keyword kw\">else</span>\n\
      666:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-node\">&quot;Invalid action '#{action.inspect}'&quot;</span>\n\
      667:             <span class=\"ruby-identifier\">action</span> = <span class=\"ruby-identifier\">:__default__</span>\n\
      668:         <span class=\"ruby-keyword kw\">end</span>\n\
      669:         \n\
      670:         <span class=\"ruby-comment cmt\"># Look up the profile for the applet or the default one</span>\n\
      671:         <span class=\"ruby-identifier\">profile</span> = <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">to_sym</span> ] <span class=\"ruby-operator\">||</span>\n\
      672:             <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">validator_profiles</span>[ <span class=\"ruby-identifier\">:__default__</span> ]\n\
      673: \n\
      674:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">profile</span>.<span class=\"ruby-identifier\">nil?</span>\n\
      675:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span> <span class=\"ruby-node\">&quot;No validator for #{action}, and no __default__. &quot;</span>\\\n\
      676:                 <span class=\"ruby-value str\">&quot;Returning nil validator.&quot;</span>\n\
      677:             <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\
      678:         <span class=\"ruby-keyword kw\">end</span>\n\
      679: \n\
      680:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">profile</span>\n\
      681:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return the <a href="Applet.html#M000558">validator</a> profile that
      corresponds to the <tt>action</tt> which will be executed by the specified
      <tt>txn</tt>. Returns the <em>default</em> profile if no more-specific one
      is available.
      </p>
    params: ( action, txn )
  - visibility: protected
    aref: M000580
    name: load_template
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 644</span>\n\
      644:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">load_template</span>( <span class=\"ruby-identifier\">key</span> )\n\
      645:         \n\
      646:         <span class=\"ruby-identifier\">tname</span> = <span class=\"ruby-ivar\">@signature</span>.<span class=\"ruby-identifier\">templates</span>[<span class=\"ruby-identifier\">key</span>] <span class=\"ruby-keyword kw\">or</span>\n\
      647:             <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">AppletError</span>, \n\
      648:                 <span class=\"ruby-value str\">&quot;No such template %p defined in the signature for %s (%s)&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      649:                 [ <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">signature</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">filename</span> ]\n\
      650: \n\
      651:         <span class=\"ruby-identifier\">tname</span>.<span class=\"ruby-identifier\">untaint</span>\n\
      652: \n\
      653:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@template_factory</span>.<span class=\"ruby-identifier\">get_template</span>( <span class=\"ruby-identifier\">tname</span> )\n\
      654:     <span class=\"ruby-keyword kw\">end</span>"
    aka: 
    - aref: Applet.html#M000581
      name: template
    m_desc: |-
      <p>
      Load and return the <a href="Applet.html#M000552">template</a> associated
      with the given <tt>key</tt> according to the applet&#8216;s <a
      href="Applet.html#M000565">signature</a>. Returns <tt>nil</tt> if no such
      <a href="Applet.html#M000552">template</a> exists.
      </p>
    params: ( key )
  - visibility: protected
    aref: M000583
    name: make_validator
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 686</span>\n\
      686:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\
      687:         <span class=\"ruby-identifier\">profile</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">get_validator_profile_for_action</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> ) <span class=\"ruby-keyword kw\">or</span>\n\
      688:             <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">nil</span>\n\
      689: \n\
      690:         <span class=\"ruby-comment cmt\"># Create a new validator object, map the request args into a regular</span>\n\
      691:         <span class=\"ruby-comment cmt\"># hash, and then send them to the validaator with the applicable profile</span>\n\
      692:         <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;Creating form validator for profile: %p&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">profile</span>\n\
      693: \n\
      694:         <span class=\"ruby-identifier\">params</span> = {}\n\
      695: \n\
      696:         <span class=\"ruby-comment cmt\"># Only try to parse form parameters if there's a form</span>\n\
      697:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">form_request?</span>\n\
      698:             <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">paramtable</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>,<span class=\"ruby-identifier\">val</span><span class=\"ruby-operator\">|</span>\n\
      699:                 <span class=\"ruby-comment cmt\"># Multi-valued vs. single params</span>\n\
      700:                 <span class=\"ruby-identifier\">params</span>[<span class=\"ruby-identifier\">key</span>] = <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_a</span>.<span class=\"ruby-identifier\">length</span> <span class=\"ruby-operator\">&gt;</span> <span class=\"ruby-value\">1</span> <span class=\"ruby-operator\">?</span> <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_a</span> <span class=\"ruby-operator\">:</span> <span class=\"ruby-identifier\">val</span>.<span class=\"ruby-identifier\">to_s</span>\n\
      701:             <span class=\"ruby-keyword kw\">end</span>\n\
      702:         <span class=\"ruby-keyword kw\">end</span>\n\
      703:         <span class=\"ruby-identifier\">validator</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">FormValidator</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">profile</span>, <span class=\"ruby-identifier\">params</span> )\n\
      704: \n\
      705:         <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;Validator: %p&quot;</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">validator</span>\n\
      706:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">validator</span>\n\
      707:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Create a <a href="FormValidator.html">FormValidator</a> object for the
      specified <tt>action</tt> which has been given the arguments from the given
      <tt>txn</tt>.
      </p>
    params: ( action, txn )
  - visibility: protected
    aref: M000579
    name: prep_transaction
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 636</span>\n\
      636:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\
      637:         <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">content_type</span> = <span class=\"ruby-value str\">&quot;text/html&quot;</span>\n\
      638:         <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">sync_header</span> = <span class=\"ruby-keyword kw\">true</span>\n\
      639:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Prepares the transaction (<tt>txn</tt>) for applet execution. By default,
      this method sets the content type of the response to
      &#8216;text/html&#8217; and turns off buffering for the header.
      </p>
    params: ( txn )
  - visibility: protected
    aref: M000578
    name: subrun
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/applet.rb, line 615</span>\n\
      615:     <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">subrun</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      616:         <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> = <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">action</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Transaction</span> )\n\
      617:         <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;Running subordinate action '%s' from '%s'&quot;</span> <span class=\"ruby-operator\">%</span>\n\
      618:             [ <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">caller</span>[<span class=\"ruby-value\">0</span>] ]\n\
      619: \n\
      620:         <span class=\"ruby-comment cmt\"># Make sure the transaction has stuff loaded. This is necessary when</span>\n\
      621:         <span class=\"ruby-comment cmt\"># #subrun is called without going through #run first (e.g., via </span>\n\
      622:         <span class=\"ruby-comment cmt\"># #delegate)</span>\n\
      623:         <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span>.<span class=\"ruby-identifier\">nil?</span>\n\
      624:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">prep_transaction</span>( <span class=\"ruby-identifier\">txn</span> )\n\
      625:             <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">vargs</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">make_validator</span>( <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-identifier\">txn</span> )\n\
      626:         <span class=\"ruby-keyword kw\">end</span>\n\
      627: \n\
      628:         <span class=\"ruby-identifier\">meth</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">lookup_action_method</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-identifier\">action</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      629:         <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">meth</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-identifier\">txn</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\
      630:     <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Run an action with a duped transaction (e.g., from another action)
      </p>
    params: ( action, txn, *args )
  - visibility: protected
    aref: M000581
    name: template
    m_desc: |-
      <p>
      Alias for <a href="Applet.html#M000580">#load_template</a>
      </p>
    params: ( key )
  category: Instance
  type: Protected

sectitle

--- 

constants

--- 
- name: SVNRev
  desc: |+
    
    SVN Revision
    
  value: "%q$Rev: 439 $"
- name: SVNId
  desc: |+
    
    SVN Id
    
  value: "%q$Id: applet.rb 439 2008-04-10 23:27:34Z deveiant $"
- name: SignatureStruct
  desc: |
    
    <a href="Applet.html">Applet</a> <a
    href="Applet.html#M000565">signature</a> struct. The fields are as follows:
    
    <dl>
    <dt><b>name</b></dt><dd>The name of the applet; used for introspection and reports.
    
    </dd>
    <dt><b>description</b></dt><dd>The description of the applet; used for introspection.
    
    </dd>
    <dt><b>maintainer</b></dt><dd>The name of the maintainer for reports and introspection.
    
    </dd>
    <dt><b>version</b></dt><dd>The version or revision number of the applet, which can be any object that
    has a #to_s method.
    
    </dd>
    <dt><b><a href="Applet.html#M000557">default_action</a></b></dt><dd>The action that will be <a href="Applet.html#M000570">run</a> if no action
    is specified.
    
    </dd>
    <dt><b>templates</b></dt><dd>A hash of templates used by the applet. The keys are Symbol identifiers
    which will be used for lookup, and the values are the paths to <a
    href="Applet.html#M000552">template</a> files.
    
    </dd>
    <dt><b>validator_profiles</b></dt><dd>A hash containing profiles for the built in form <a
    href="Applet.html#M000558">validator</a>, one per action. See the
    documentation for <a href="FormValidator.html">FormValidator</a> for the
    format of each profile hash.
    
    </dd>
    </dl>

  value: Struct.new( :name, :description, :maintainer,         :version, :config, :default_action, :templates, :validator_profiles,         :appicon )
- name: SignatureStructDefaults
  desc: |+
    
    Default-generators for Signatures which are missing one or more of the
    optional pairs.
    
  value: "{         :name             =&gt; proc {|rawsig, klass| klass.name},         :description      =&gt; &quot;(none)&quot;,         :maintainer           =&gt; &quot;&quot;, # Workaround for RDoc         :version          =&gt; nil, # Workaround for RDoc         :default_action       =&gt; '_default',         :config               =&gt; {},         :templates            =&gt; {},         :validator_profiles   =&gt; {             :__default__     =&gt; {                 :optional           =&gt; [:action],                 :constraints        =&gt; {                     :action =&gt; /^\\w+$/,                 },             },         },         :appicon          =&gt; 'application-x-executable.png',     }"

aliases

--- 
- old_name: template
  desc: |+
    
    Allow either &#8216;<a href="Applet.html#M000552">template</a>&#8217; or
    &#8216;templates&#8216;
    
  new_name: templates

[Validate]

Generated with the Darkfish Rdoc Generator.