Source: https://userswww.pd.infn.it/~ronchese/cxx/y1213/lectures/composite/composite.pdf