internal FunctionalProperty(string name, Type propertyType, Type ownerType, FunctionalPropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
 {
     Name = name;
     PropertyType = propertyType;
     OwnerType = ownerType;
     DefaultMetadata = typeMetadata;
     ValidateValueCallback = validateValueCallback;
 }
 public static FunctionalProperty Register(string name, Type propertyType, Type ownerType, FunctionalPropertyMetadata typeMetadata)
 {
     return Register(name, propertyType, ownerType, typeMetadata, null);
 }
 public static FunctionalProperty Register(string name, Type propertyType, Type ownerType, FunctionalPropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
 {
     return FunctionalPropertyManager.Instance.Register(name, propertyType, ownerType, typeMetadata, validateValueCallback);
 }
        internal FunctionalProperty Register(string name, Type propertyType, Type ownerType, FunctionalPropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
        {
            if (String.IsNullOrEmpty(name))
                throw new ArgumentNullException("name", "name is null.");
            if (propertyType == null)
                throw new ArgumentNullException("propertyType", "propertyType is null.");
            if (ownerType == null)
                throw new ArgumentNullException("ownerType", "ownerType is null.");
            if (FunctionalPropertiesInternal.ContainsKey(ownerType))
            {
                if (FunctionalPropertiesInternal[ownerType].Any(cur => cur.Name == name))
                    throw new ArgumentException(String.Format("FunctionalProperty Name '{0}' for OwnerType '{1}' already used.", name, ownerType));
            }
            if (typeMetadata != null)
            {
                if (typeMetadata.DefaultValue != null && propertyType.IsAssignableFrom(typeMetadata.DefaultValue.GetType()) == false)
                    throw new ArgumentException(String.Format("Default value type does not match type of property '{0}'.", name));

                if (typeMetadata.DefaultValue == null && propertyType.IsValueType)
                    typeMetadata.DefaultValue = Activator.CreateInstance(propertyType);

                if (validateValueCallback != null && validateValueCallback(typeMetadata.DefaultValue) == false)
                    throw new ArgumentException(String.Format("Default value for '{0}' property is not valid because ValidateValueCallback failed.", name));
            }

            FunctionalPropertyMetadata actualMetadata = typeMetadata ?? new FunctionalPropertyMetadata(propertyType.IsValueType ? Activator.CreateInstance(propertyType) : null);
            FunctionalProperty functionalProperty = new FunctionalProperty(name, propertyType, ownerType, actualMetadata, validateValueCallback);
            if (!FunctionalPropertiesInternal.ContainsKey(ownerType))
                FunctionalPropertiesInternal[ownerType] = new List<FunctionalProperty>();

            FunctionalPropertiesInternal[ownerType].Add(functionalProperty);
            return functionalProperty;
        }