void IEventSourcedAggregateRoot.Apply(VersionedDomainEvent change)
        {
            var onMethod = GetType()
                           .GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
                           .Where(m => m.Name.Equals("On"))
                           .Where(m => m.GetParameters()
                                  .SingleOrDefault(p => p.ParameterType.FullName.Equals(change.GetType().FullName)) != null);

            onMethod.Single().Invoke(this, new object[] { change });
        }
        protected void ApplyChange(VersionedDomainEvent change)
        {
            _changes.Add(change);
            change.Version         = Version + 1;
            change.AggregateRootId = Identity;
            change.OccuredOn       = DateTime.Now;
            change.EventType       = change.GetType().Name;
            Version = change.Version;

            (this as IEventSourcedAggregateRoot).Apply(change);
        }