class Sys::Signal {
  use Sys::Signal::Constant;
  use Sys::Signal::Handler;
  use Sys::Signal::Handler::Default;
  use Sys::Signal::Handler::Ignore;
  use Sys::Signal::Handler::Monitor;
  use Sys::Signal::Handler::Unknown;
  
  our $SIG_DFL : ro Sys::Signal::Handler::Default;
  our $SIG_IGN : ro Sys::Signal::Handler::Ignore;
  our $SIG_MONITOR : ro Sys::Signal::Handler::Monitor;
  
  INIT {
    $SIG_DFL = &new_signal_handler_sig_dfl();
    $SIG_IGN = &new_signal_handler_sig_ign();
    $SIG_MONITOR = &new_signal_handler_sig_monitor();
  }

  private native static method new_signal_handler_sig_dfl : Sys::Signal::Handler::Default ();
  private native static method new_signal_handler_sig_ign : Sys::Signal::Handler::Ignore ();
  private native static method new_signal_handler_sig_monitor : Sys::Signal::Handler::Monitor ();

  native static method raise : int ($sig : int);
  native static method kill : int ($pid : int, $sig : int);
  native static method alarm : int ($seconds : int);
  native static method ualarm : int ($usecs : int, $interval : int);
  
  native static method signal : Sys::Signal::Handler ($signum : int, $handler : Sys::Signal::Handler);
  native static method reset_monitored_signal : void ($signum : int);
  native static method check_monitored_signal : int ($signum : int);
}