class:: AbstractServerAction
summary:: register actions to be taken for a server
related:: Classes/Server, Classes/ServerBoot, Classes/ServerTree, Classes/ServerQuit
categories:: Control

description::

This is an strong::abstract superclass:: for singletons like link::Classes/ServerQuit::, which provides a place for registering functions and objects for events that should happen when something happens in the server.
No direct call to AbstractServerAction is required.

note:: not fully working on linux and windows.
Setting the computer to sleep on these systems causes the actions to be called.
As to date in linux, JACK does not survive a sleep, it nevertheless behaves correctly for the time being.
::

ClassMethods::

method::functionSelector
Subclasses return specific function selectors for objects that implement this as interface.
Selectors are:
list::
## doOnServerBoot - link::Classes/ServerBoot::
## doOnServerQuit - link::Classes/ServerQuit::
## doOnServerTree - link::Classes/ServerTree::
::

not for registry with a server, but analogous are:
list::
## doOnCmdPeriod - link::Classes/CmdPeriod::
## doOnStartUp - link::Classes/StartUp::
## doOnShutDown - link::Classes/ShutDown::
::

method::add
Add an action or object for registry.

argument::object
Can either be a link::Classes/Function:: to be evaluated (as first arg the server is passed in), or an link::Classes/Object:: that implements the message returned by link::#-functionSelector::. strong::One object is only registered once::, so that multiple additions don't cause multiple calls.

argument::server
Server for which to register. If the symbol strong::\default:: is passed in, the action is called for the current default server. If the symbol strong::\all:: is passed in, the action is called for all current servers. If server is nil, it is added to \default.

method::remove
Remove an item or object from registry. If server is nil, remove from strong::default:: key.

method::removeServer
Remove all items that are registered for a given server.

Examples::

code::
// ServerBoot
s.boot;
f = { |server| "------------The server '%' has booted.------------\n".postf(server) };
ServerBoot.add(f, \default);
s.quit; // quit the server and observe the post
s.boot;
ServerBoot.remove(f, \default); // remove it again
s.quit;
s.boot;// no post.
ServerBoot.add(f, Server.internal);
Server.internal.quit;
Server.internal.boot;
ServerBoot.removeAll; // clear all
::

code::
// ServerQuit
s.boot;
f = { |server| "------------The server '%' has quit.------------\n".postf(server) };
ServerQuit.add(f, \default);
s.quit; // quit the server and observe the post
s.boot;
ServerQuit.remove(f, \default); // remove it again
s.quit; // no post.
ServerQuit.add(f, Server.internal);
Server.internal.boot;
Server.internal.quit;
ServerQuit.removeAll; // clear all
::

code::
// ServerTree
s.quit;
f = { |server| "-------The server '%' has initialised tree.-------\n".postf(server) };
g = { |server| 10.do { Group(server).postln } };
ServerBoot.add(f, \default);
ServerTree.add(g, \default);
s.boot; // boot and see how the actions are evaluated in order
// "cmd-period" (or equivalent) resends the groups.

ServerBoot.removeAll; // clear all
ServerTree.removeAll; // clear all
::
