/// <summary>
        /// Initializes the output event
        /// </summary>
        /// <param name="input">The input model element</param>
        /// <param name="output">The output model element</param>
        /// <param name="context">The transformation context</param>
        public override void Transform(T input, CodeMemberEvent output, ITransformationContext context)
        {
            CodeTypeReference eventArgsType = GetEventArgsType(input, context);

            output.Name = GetName(input);

            if (eventArgsType != null)
            {
                output.Type = new CodeTypeReference(typeof(EventHandler <>).Name, eventArgsType);
            }
            else
            {
                eventArgsType = new CodeTypeReference(typeof(EventArgs).Name);
                output.Type   = new CodeTypeReference(typeof(EventHandler).Name);
            }

            var onChangedMethod = CodeDomHelper.CreateOnChangedMethod(output, eventArgsType);

            output.DependentMembers(true).Add(onChangedMethod);
        }
        /// <summary>
        /// Generates an OnChanged-pattern for the given property
        /// </summary>
        /// <param name="property">The code property</param>
        /// <returns>The statement to call the OnChanged method for the given property</returns>
        public static CodeStatement CreateOnChangedEventPattern(this CodeMemberProperty property, CodeTypeReference eventType, CodeExpression eventData)
        {
            CodeTypeReference handlerType;

            if (eventType == null)
            {
                handlerType = new CodeTypeReference(typeof(EventHandler).Name);
            }
            else
            {
                handlerType = new CodeTypeReference(typeof(EventHandler <>).Name, eventType);
            }
            var changedEvent = new CodeMemberEvent()
            {
                Name       = property.Name + "Changed",
                Type       = handlerType,
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            };

            changedEvent.WriteDocumentation(string.Format("Gets fired when the {0} property changed its value", property.Name));

            if (eventType == null)
            {
                eventType = new CodeTypeReference(typeof(EventArgs).Name);
                eventData = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(eventType), "Empty");
            }
            var onChanged = CodeDomHelper.CreateOnChangedMethod(changedEvent, eventType);

            var dependent = property.DependentMembers(true);

            dependent.Add(onChanged);
            dependent.Add(changedEvent);

            var onChangedRef = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), onChanged.Name);

            return(new CodeExpressionStatement(new CodeMethodInvokeExpression(onChangedRef, eventData)));
        }