http://www.ipipan.gda.pl/~marek/objects/faq/oo-faq-S-3.12.html