У любого Gobject объекта есть сигнал notify который испускается во время изменения переменной. Таким образом можно очень легко разрабатывать в событийно-ориентированном стиле.

	class Animal : GLib.Object {
		private int _legs; 

		public int legs {
			get { return _legs; }
			set { _legs = value; }
		}
		public int eyes { get; set; default = 5; } // Shorter way
	}

	void main(){
		var rabbit = new Animal();


		rabbit.notify["eyes"].connect((s,p) => {
		    stdout.printf(@"$(p.name) has changed");
		});

		rabbit.legs = 2;
		rabbit.legs -= 2;//	трамвайчик
		rabbit.eyes = 2;
	}

Lurk

Парадигма, которая представляет программу как набор реакций на изменяющееся состояние. Ближайший аналог ИРЛ — условные рефлексы. Это позволяет здорово упростить представление: вместо одной обширной и необъятной блок-схемы, не умещающейся на листе ватмана формата A0, получается более удобный список небольших блок-схем, повешенных на события, что изрядно улучшает структуру обычной программы. Событийные языки поддерживают встроенный обработчик событий (к таковым относятся Delphi и C#), но при желании можно легко реализовать события на любом ООП языке с помощью паттерна en.w:Observer, чем и пользуются разработчики на C++ и Java. Раньше событийная парадигма была золотым стандартом фреймвёрков (её используют такие мастодонты, как Delphi, WinForms и ранние версии QT), но с популяризацией паттернов en.w:MVC и en.w:MVVM веяние сошло на нет.

Дело в том, что у событий есть одна маленькая проблема. Обработчики, висящие на событии, могут быть объявлены где угодно и кроме как при отладке нигде не видны. Причем они могут изменить состояние вызвавшего их объекта (традиция передавать sender как первый параметр тянется уже добрых четверть века) или вызывать следующие обработчики (ведь события это ни что иное, как реинкарнация оператора goto на более высоком уровне). В итоге простейший код можно превратить в эталонную лапшу. Что быдло и делает.