44                 using Registration = std::shared_ptr<void>;
 
   53                         using UniversalPtr = std::shared_ptr<void>; 
 
   63                         template <
typename Deleter>
 
   66                                 return UniversalPtr((
void*) 0xDEADC0DE, deleter);
 
   89                                         std::weak_ptr<UniversalPtr::element_type> weakHeartBeat(heartBeat_);
 
   98                                                 if (
auto isBeating = weakHeartBeat.lock())
 
  108                                 UniversalPtr heartBeat_;
 
  111                         template<
typename EventTypeBase>
 
  120                                         std::weak_ptr<UniversalPtr::element_type> weakHeartBeat(heartBeat_);
 
  129                                                 if (
auto isBeating = weakHeartBeat.lock())
 
  136                                 std::map<EventTypeBase, std::vector<UniversalPtr>> 
observers_;
 
  139                                 UniversalPtr heartBeat_;
 
  146                 template <
typename SignatureFunc>
 
  153                 template <
typename Return, 
typename... Params>
 
  156                         using F = std::function<Return (Params...)>;
 
  157                         using FPtr = std::shared_ptr<F>; 
 
  159                         void operator()(Params... params)
 
  161                                 for (
auto const & observer : observers_)
 
  163                                         FPtr 
const fptr = std::static_pointer_cast<F>(observer);
 
  168                         Registration registerObserver(F f)
 
  170                                 FPtr fptr(
new F(std::move(f)));
 
  171                                 return SubjectBase::registerObserver(fptr);
 
  176                 template <
typename SignatureEventType, 
typename SignatureFunc>
 
  179                 template <
typename EventType, 
typename Return, 
typename... Params>
 
  183                         using F = std::function<Return (Params...)>;
 
  184                         using FPtr = std::shared_ptr<F>;
 
  186                         void operator()(EventType 
const & e, Params... params)
 
  190                                         for (
auto const & observer : this->observers_.at(e))
 
  192                                                 FPtr 
const fptr = std::static_pointer_cast<F>(observer);
 
  196                                 catch(std::out_of_range 
const & e)
 
  202                         Registration registerObserver(EventType 
const & e, F f)
 
  204                                 FPtr fptr(
new F(std::move(f)));
 
  211 #endif  // OBSERVER_HPP