public override ModelValidationResultSet <TDefinition> Validate <TDefinition>(ModelNode node, Action <TypedModelValidationResult <TDefinition> > action)
        {
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }

            var result = new ModelValidationResultSet <TDefinition>();

            WalkModel(result, null, node, action, validationContext =>
            {
                return(validationContext.ValidationContext.CurrentDefinition is TDefinition);
            });

            return(result);
        }
        private void WalkModel <TDefinition>(ModelValidationResultSet <TDefinition> result, ModelNode parentModelNode, ModelNode node,
                                             Action <TypedModelValidationResult <TDefinition> > action,
                                             Func <TypedModelValidationResult <TDefinition>, bool> filterCallback)
            where TDefinition : DefinitionBase
        {
            var validationResult = new TypedModelValidationResult <TDefinition>
            {
            };

            validationResult.ValidationContext.ParentModelNode  = parentModelNode;
            validationResult.ValidationContext.CurrentModelNode = node;

            validationResult.ValidationContext.ParentDefinition  = parentModelNode != null ? parentModelNode.Value : null;
            validationResult.ValidationContext.CurrentDefinition = node.Value as TDefinition;

            validationResult.ValidationContext.ChildModelNodes  = node.ChildModels;
            validationResult.ValidationContext.ChildDefinitions = node.ChildModels.Where(m => m.Value is TDefinition).Select(m => m.Value as TDefinition);

            if (filterCallback != null)
            {
                if (filterCallback(validationResult))
                {
                    action(validationResult);
                    result.ValidationResults.Add(validationResult);
                }
            }
            else
            {
                action(validationResult);
                result.ValidationResults.Add(validationResult);
            }

            foreach (var childNode in node.ChildModels)
            {
                WalkModel(result, node, childNode, action, filterCallback);
            }
        }