public void Intercept(IInvocation invocation)
        {
            var property = invocation.GetPropertyIfSetInvocation();
            if (invocation.InvocationTarget == null || property == null)
            {
                invocation.Proceed();

                var attributes = invocation.Method.GetCustomAttributes(typeof(ModifiesAttribute), true).OfType<ModifiesAttribute>();
                if (invocation.InvocationTarget != null && attributes.Any())
                {
                    foreach (var modifiesAttribute in attributes)
                    {
                        var modified = invocation.InvocationTarget.GetType().GetProperty(modifiesAttribute.PropertyName);
                        RaisePropertyChanged(invocation.InvocationTarget, modified);
                    }
                }

                return;
            }

            RemoveAssociation(invocation.InvocationTarget, property.Value(invocation.InvocationTarget), property);
            invocation.Proceed();

            AddAssociation(invocation.InvocationTarget, property.Value(invocation.InvocationTarget),
                property, RaisePropertyChanged);

            RaisePropertyChanged(invocation.InvocationTarget, property);
        }