Proposal for implementing services in squeak, need feedback

Todd Blanchard tblanchard at mac.com
Wed Mar 17 06:43:14 UTC 2004


Sounds very Macintosh OS X NextStep-ish.  I like it OK.


On Mar 16, 2004, at 1:56 AM, Romain Robbes wrote:

> Hi all,
>
> 	While trying to dissociate the RB's ui, in order to use it for other 
> browsers, like
> OmniBrowser and Whisker, I have come up with a more general Service 
> design
> (and a part of the implementation), that I'd like to share with you, 
> to know if you agree
> with it, or have propositions to enhance it.
>
> The goal is to have a registry of services, classified by categories, 
> and usable by menus,
> buttons, keystrokes (linking with the KeyMapper should be possible),
> and a kind of commandline like Vim's one or Emacs' minibuffer
> (won't you emacs freaks like to type : M-x extract-method  ?;-)))
>
> Categories should mainly be used by menus, to display relevant actions,
> otherwise services could be triggered by the commandline or by 
> shortcuts
> from nearly anywhere (M-x close-window, Alt-w c ...).
>
> Categories of services registered could be :
> -World Menu services
> -Open/Help/Appearance/Windows/... Menu services (subcategories of the 
> world menu)
> -Class services
> -Methods services
> -Text Selection  services
> -Refactoring services, as subcategories of the Class/Methods and Text 
> Selection services
> -Browser's button bar services.
>
> This way adding services to the system could be much easier.
> This could permit other services as :
> - Typing services, using the RefactoryTyper
> - BrowseUnit services for my case, ....
>
> I've also looked at the FileList services, and I think I have a more 
> general solution.
>
>
> So here would be the way to define a service
>
> ExtractMethodRefactoring  >> service :
> 	"answer a service using the current code selection to extract it"
> 	^ Service new	label: 'Extract method';
> 				description: 'Extracts the current code selection, in a new method
> 						using the necessary parameters, replacing the selection
> 						with a self message send.'
> 				action: [:class :selector :selection |
> 						(self extract: selection from: selector in: class) execute]
>
> These would be the default parameters to provide, optional one 
> includes :
>
> 	condition: [:selectionNode | selectionNode isMessage]
> 		
> 		Precondition for the service to execute/ to be displayed in a menu.
>
> 	shortLabel: 'extract'
>
> 		shorter label for a button / label is for a menu/ or for the command 
> name
>
> 	answerDo: [:answer | self inform: 'extraction was succesfull']
> 	
> 		if the service user wants to use the result of the service
>
> Now you must be wondering how to fetch the parameters to fill the 
> blocks used.
> The idea would be to use a Requestor object, using the #requestor: 
> message,
>  which wil act as an interface between the service user and the 
> service :
>
> For each of the arguments needed by the service (for the refactoring 
> service, these would
> be : selectionNode, and then class, selector, selection), a method is 
> triggered in the
> Requestor : requestSelectionNode, requestClass, requestSelector, 
> requestSelection.
>
> The Requestor base class handles them in a default way, asking the 
> users for the
> parameters, via FillInTheBlanks at the moment, and is able to handle 
> unknow requests
> in a default way.
>
> The requestor can them be subclassed to handle particular queries, i.e
>
> BrowserRequestor >> requestClass
> 	^ myBrowser selectedClassOrMetaclass
>
> BrowserRequestor >> requestSelector
> 	^ myBrowser selectedMessageName
>
> BrowserRequestor >> requestSelection
> 	^ myBrowser selectionInterval
>
> FileRequestor >> requestFileName
>
> WindowRequestor >> requestSystemWindow
> 	^ myWindow
>
> Requestor >> requestSystemWindow
> 	"pop up a window list and ask the user for a window"
>
> The service would be used by an object by finding them, querying
> the Service class for available services or service categories,
> giving the services the object's requestor, and displaying them.
>
> What do you think of this (If you read this far that is) ?
>
> So far I have implemented Services and their displaying as menu and 
> buttons,
> Some requestor classes and methods, tested them with various services
> (The ExtractMethodRefactoring works with the basic requestor and the 
> browser
> requestor for example, asking the user for parameters in one case, 
> fetching them in
> the current browsed method for the other), and I am implementing 
> services categories
>  and the service registry. Remaining works includes referencing a lot 
> of services
> (senders/implementors, the world menu ...) but the refactorings are 
> working with a
> previous version of the stuff, so they won't be hard to include.
>
> 	Thanks for any feedback,
> 		Romain
>
>




More information about the Squeak-dev mailing list