[/
 / Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:Service Service requirements]

A class is a ['service] if it is publicly and unambiguously derived from
`execution_context::service`, or if it is publicly and unambiguously derived
from another service. For a service `S`, `S::key_type` shall be valid and
denote a type (C++Std [temp.deduct]), `is_base_of_v<typename S::key_type, S>`
shall be `true`, and `S` shall satisfy the `Destructible` requirements (C++Std
[destructible]).

The first parameter of all service constructors shall be an lvalue reference to
`execution_context`. This parameter denotes the `execution_context` object that
represents a set of services, of which the service object will be a member.
[inline_note These constructors may be called by the `make_service` function.]

A service shall provide an explicit constructor with a single parameter of
lvalue reference to `execution_context`. [inline_note This constructor may be
called by the `use_service` function.]

  class my_service : public execution_context::service
  {
  public:
    typedef my_service key_type;
    explicit my_service(execution_context& ctx);
    my_service(execution_context& ctx, int some_value);
  private:
    virtual void shutdown() noexcept override;
    ...
  };

A service's `shutdown` member function shall destroy all copies of user-defined
function objects that are held by the service.

[endsect]
