The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
class Circle.Commandable {
  method do_command(str);
}

class Circle.WindowItem {
  isa Circle.Commandable;

  event raise();

  method reset_level();
  method get_widget() -> obj;

  smashed prop tag = str;
  smashed prop level = int;
}

class Circle.RootObj {
  isa Circle.WindowItem;

  method get_session(list(str)) -> obj;

  event network_added(obj);

  prop networks = hash of obj;
}

class Circle.Session.Tabbed {
  prop tabs = array of obj;
}

class Circle.Net.IRC {
  isa Circle.WindowItem;

  method get_isupport(str) -> any;

  event connected();
  event disconnected();

  prop nick = str;
  prop away = bool;
  prop channels = objset of obj;
  prop users    = objset of obj;
}

class Circle.Net.IRC.Target {
  isa Circle.WindowItem;

  method msg(str);
  method notice(str);
  method act(str);

  event msg(str,str);
  event notice(str,str);
  event act(str, str);

  smashed prop name = str;
  smashed prop net = obj;
  smashed prop real = bool;
}

class Circle.Net.IRC.User {
  isa Circle.Net.IRC.Target;

  event change_nick(str,str,str,str);

  prop ident = str;
}

class Circle.Net.IRC.Channel {
  isa Circle.Net.IRC.Target;

  method mode(str,list(str));
  method topic(str);

  event self_joined();
  event self_parted();
  event join(str);
  event part(str,str);
  event kick(str,str,str);
  event topic(str,str);

  prop topic = str;
  prop occupants = hash of dict(any);
  prop occupant_summary = hash of int;
  prop my_flag = str;
  prop mode = hash of str;
  prop modestr = str;
}

class Circle.Net.Raw {
  isa Circle.WindowItem;

  event connected(str,int);
  event disconnected();

  prop connected = bool;
}

class Circle.Widget {
  smashed prop classes = array of str;
  smashed prop focussed = bool;
}

class Circle.Widget.Box {
  isa Circle.Widget;

  smashed prop orientation = str; # TODO: enumeration
  smashed prop children = array of dict(any);
}

class Circle.Widget.Entry {
  isa Circle.Widget;

  method enter(str);

  smashed prop autoclear = bool;
  prop text = str;
  prop history = queue of str;

  prop completions = objset of obj;
}

class Circle.Widget.Entry.CompleteGroup {
  smashed prop only_at_sol = bool;
  smashed prop prefix_sol = str;
  smashed prop suffix_sol = str;

  smashed prop items = array of str;
}

class Circle.Widget.Label {
  isa Circle.Widget;

  prop text = str;
}

class Circle.Widget.Scroller {
  isa Circle.Widget;

  prop displayevents = queue of list(any);
}