mirror of
				https://github.com/flynx/actions.js.git
				synced 2025-10-31 03:10:09 +00:00 
			
		
		
		
	started work on docs..
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									810dfe3dcc
								
							
						
					
					
						commit
						0df03cab41
					
				
							
								
								
									
										242
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										242
									
								
								README.md
									
									
									
									
									
								
							| @ -1 +1,241 @@ | |||||||
| # features | # Features / Actions | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Actions | ||||||
|  | 
 | ||||||
|  | Actions are an extension to the JavaScript object model tailored for | ||||||
|  | a set of specific tasks. | ||||||
|  | 
 | ||||||
|  | ### Goals: | ||||||
|  | 	- provide a unified mechanism to define and manage user API's for  | ||||||
|  | 	  use in UI-hooks, keyboard mappings, scripting, ... etc. | ||||||
|  | 	- a means to generate configuration UI's | ||||||
|  | 	- a means to generate documentation | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### The main entities: | ||||||
|  | 
 | ||||||
|  | **Action set** | ||||||
|  | - an object containing a number of actions, | ||||||
|  | - optionally, directly or indirectly inherited from MetaActions | ||||||
|  |   and/or other action sets, | ||||||
|  | - the action handlers are bound relative to it (._action_handlers) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | **Action** | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  |                         +  pre  +  pre  +       +  post +  post + | ||||||
|  | Action event handler:   o-------x                       o-------x | ||||||
|  |                                 v                       ^ | ||||||
|  | Actions                         o-------x       o-------x | ||||||
|  |                                         v       ^ | ||||||
|  | Root Action                             o---|---x | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - a method, created by Action(..), | ||||||
|  | - calls all the shadowed/overloaded actions in the inheritance  | ||||||
|  |   chain in sequence implicitly, | ||||||
|  |   NOTE: there is no way to prevent an action in the chain from | ||||||
|  | 		running, this is by design, i.e. no way to fully shadow. | ||||||
|  | - actions that do not shadow anything are called root actions. | ||||||
|  | - returns the action set by default (for call chaining), | ||||||
|  | - the base/root action can return any value. | ||||||
|  |   NOTE: if undefined is returned, it will be replaced by the  | ||||||
|  | 		action context/action set. | ||||||
|  |   NOTE: there is no distinction between root and other actions | ||||||
|  | 		other than that root action's return values are not  | ||||||
|  | 		ignored. | ||||||
|  | - can consist of two parts: the first is called before the  | ||||||
|  |   shadowed action (pre-callback) and the second after (post-callback). | ||||||
|  | - post-callback has access to the return value and can modify it | ||||||
|  |   but not replace it. | ||||||
|  | - can be bound to, a-la an event, calling the handlers when it is  | ||||||
|  |   called,  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | **Action (event) handler** | ||||||
|  | - a function, | ||||||
|  | - can be bound to run before and/or after the action itself, | ||||||
|  | - is local to an action set it was bound via, | ||||||
|  | - when an action is triggered from an action set, all the pre  | ||||||
|  |   handlers in its inheritance chain will be called before the  | ||||||
|  |   respective actions they are bound to and all the post handlers | ||||||
|  |   are called directly after. | ||||||
|  | - pre handlers are passed the same arguments the original actions | ||||||
|  |   got when it was called. | ||||||
|  | - post action handlers will get the root action result as first  | ||||||
|  |   argument succeeded by the action arguments. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### The action system main protocols: | ||||||
|  | 
 | ||||||
|  | 1) Documentation generation and introspection (MetaActions) | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | <action>.toString() | ||||||
|  | 		-> code of original action function | ||||||
|  | 
 | ||||||
|  | <action-set>.getDoc() | ||||||
|  | <action-set>.getDoc(<action-name>[, ..]) | ||||||
|  | 		-> dict of action-name, doc | ||||||
|  | 
 | ||||||
|  | <action-set>.a.getHandlerDocStr(<action-name>) | ||||||
|  | 		-> formated string of action handlers | ||||||
|  | 
 | ||||||
|  | <action-set>.actions | ||||||
|  | 		-> list of action names | ||||||
|  | 
 | ||||||
|  | <action-set>.length | ||||||
|  | 		-> number of actions | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 2) Event-like callbacks for actions (MetaActions, Action) | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | <action-set>.on('action', function(){ ... }) | ||||||
|  | <action-set>.on('action.post', function(){ ... }) | ||||||
|  | 
 | ||||||
|  | <action-set>.on('action.pre', function(){ ... }) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 3) A mechanism to define and extend already defined actions | ||||||
|  | 	This replaces / complements the standard JavaScript overloading  | ||||||
|  | 	mechanisms (Action, Actions) | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | // Actions... | ||||||
|  | var X = Actions({ | ||||||
|  | 	m: [function(){ console.log('m') }] | ||||||
|  | }) | ||||||
|  | var O = Actions(X, { | ||||||
|  | 	m: [function(){ | ||||||
|  | 		console.log('pre') | ||||||
|  | 		return function(res){ | ||||||
|  | 			console.log('post') | ||||||
|  | 		} | ||||||
|  | 	}] | ||||||
|  | }) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  |  NOTE: what is done here is similar to calling O.__proto__.m.call(..) | ||||||
|  |  	but is implicit, and not dependant on the original containing  | ||||||
|  |  	object name/reference ('O'), thus enabling an action to be  | ||||||
|  |  	referenced and called from any object and still chain correctly. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### Secondary action protocols: | ||||||
|  | 
 | ||||||
|  | 1) A mechanism to manually call the pre/post stages of an action | ||||||
|  | 
 | ||||||
|  | Pre phase... | ||||||
|  | ``` | ||||||
|  | <action>.pre(<context>) | ||||||
|  | <action>.pre(<context>, [<arg>, ..]) | ||||||
|  | 	-> <call-data> | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Post phase... | ||||||
|  | ``` | ||||||
|  | <action>.post(<context>, <call-data>) | ||||||
|  | 	-> <result> | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | This is internally used to implement the action call as well as the | ||||||
|  | chaining callbacks (see below). | ||||||
|  | 
 | ||||||
|  | All action protocol details apply. | ||||||
|  | 
 | ||||||
|  | NOTE: there is not reliable way to call the post phase without first | ||||||
|  | 	calling the pre phase due to how the pre phase is defined (i.e. | ||||||
|  | 	pre phase functions can return post phase functions). | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 2) A mechanism to chain/wrap actions or an action and a function. | ||||||
|  | 	This enables us to call a callback or another action (inner) between  | ||||||
|  | 	the root action's (outer) pre and post stages. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | Outer action                o-------x       o-------x | ||||||
|  |                                     v       ^ | ||||||
|  | Inner action/callback               o---|---x | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | A trivial example: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | actionSet.someAction.chainApply(actionsSet,  | ||||||
|  | 	function(){ | ||||||
|  | 		// this gets run between someAction's pre and post  | ||||||
|  | 		// stages... | ||||||
|  | 	},  | ||||||
|  | 	args) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | This is intended to implement protocols where a single action is | ||||||
|  | intended to act as a hook point (outer) and multiple different  | ||||||
|  | implementations (inner) within a single action set can be used as | ||||||
|  | entry points. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | // Protocol root action (outer) definition... | ||||||
|  | protocolAction: [function(){}], | ||||||
|  | 
 | ||||||
|  | // Implementation actions (inner)... | ||||||
|  | implementationAction1: [function(){ | ||||||
|  | 	return this.protocolAction.chainApply(this, function(){ | ||||||
|  | 		// ... | ||||||
|  | 	}, ..) | ||||||
|  | }] | ||||||
|  | 
 | ||||||
|  | implementationAction2: [function(){ | ||||||
|  | 	return this.protocolAction.chainApply(this, function(){ | ||||||
|  | 		// ... | ||||||
|  | 	}, ..) | ||||||
|  | }] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Now calling any of the 'implementation' actions will execute code | ||||||
|  | in the following order: | ||||||
|  |  	1) pre phase of protocol action (outer) | ||||||
|  |  	2) implementation action (inner) | ||||||
|  |  	3) post phase of protocol action (outer) | ||||||
|  | 
 | ||||||
|  | NOTE: this will not affect to protocol/signature of the outer action | ||||||
|  |  	in any way. | ||||||
|  | NOTE: both the inner and outer actions will get passed the same  | ||||||
|  |  	arguments. | ||||||
|  | NOTE: another use-case is testing/debugging actions. | ||||||
|  | NOTE: this is effectively the inside-out of normal action overloading. | ||||||
|  | NOTE: there is intentionally no shorthand for this feature, to avoid  | ||||||
|  |  	confusion and to discourage the use of this feature unless | ||||||
|  |  	really necessary. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 3) `.__call__` action / handler | ||||||
|  | 	This action if defined is called for every action called. It behaves | ||||||
|  | 	like any other action but with a fixed signature, it always receives  | ||||||
|  | 	the action name as first argument and a list of action arguments as | ||||||
|  | 	the second arguments, and as normal a result on the post phase. | ||||||
|  | 
 | ||||||
|  | 	NOTE: it is not necessary to define the actual action, binding to a | ||||||
|  | 		handler will also work. | ||||||
|  | 	NOTE: one should not call actions directly from within a __call__  | ||||||
|  | 		handler as that will result in infinite recursion. | ||||||
|  | 		XXX need a way to prevent this... | ||||||
|  | 	NOTE: one should use this with extreme care as this will introduce  | ||||||
|  | 		an overhead on all the actions if not done carefully. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Features | ||||||
|  | 
 | ||||||
|  | XXX | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <!-- vim:set ts=4 sw=4 spell : --> | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ function(require){ var module={} // makes module AMD/node compatible... | |||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| 
 | 
 | ||||||
| var object = require('ig-object') | var object = require('ig-object') | ||||||
| var actions = require('./actions') | var actions = module.actions = require('./actions') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user