just to complicate things a bit separated definition from implementation :)