public CellFactoryInvokerClass (System.Type aType, CellFactoryProviderAttribute aAttr)
		{
			factoryType = aType;
			factoryProvider = aAttr;

			if (ShellMethod == null)
				ShellMethod = this.GetType().GetMethod ("Invoke");
			if (ShellMethodParameters == null)
				ShellMethodParameters = ShellMethod.GetParameters();
			
			MethodInfo[] methods = aType.GetMethods();
			foreach (MethodInfo method in methods) {
				if ((method.IsStatic == true) && (method.Name == aAttr.MethodName)) {
					ParameterInfo[] parms = method.GetParameters();
					if (method.ReturnType != ShellMethod.ReturnType)
						continue;
					if (ShellMethodParameters.Length == parms.Length) {
						for (int i=0; i<ShellMethodParameters.Length; i++)
							if (ShellMethodParameters[i].ParameterType != parms[i].ParameterType)
								continue;
					}
					factoryMethod = method;
				}
			}
			if (factoryMethod == null)
				throw new Exception ("Class doesn't support factory method");
		}
        public CellFactoryInvokerClass(System.Type aType, CellFactoryProviderAttribute aAttr)
        {
            factoryType     = aType;
            factoryProvider = aAttr;

            if (ShellMethod == null)
            {
                ShellMethod = this.GetType().GetMethod("Invoke");
            }
            if (ShellMethodParameters == null)
            {
                ShellMethodParameters = ShellMethod.GetParameters();
            }

            MethodInfo[] methods = aType.GetMethods();
            foreach (MethodInfo method in methods)
            {
                if ((method.IsStatic == true) && (method.Name == aAttr.MethodName))
                {
                    ParameterInfo[] parms = method.GetParameters();
                    if (method.ReturnType != ShellMethod.ReturnType)
                    {
                        continue;
                    }
                    if (ShellMethodParameters.Length == parms.Length)
                    {
                        for (int i = 0; i < ShellMethodParameters.Length; i++)
                        {
                            if (ShellMethodParameters[i].ParameterType != parms[i].ParameterType)
                            {
                                continue;
                            }
                        }
                    }
                    factoryMethod = method;
                }
            }
            if (factoryMethod == null)
            {
                throw new Exception("Class doesn't support factory method");
            }
        }
 /// <summary>
 /// Adds class to list of factory provider handlers
 /// </summary>
 /// <param name="aType">
 /// Factory type <see cref="System.Type"/>
 /// </param>
 /// <param name="aAttr">
 /// Attribute <see cref="WidgetFactoryProviderAttribute"/>
 /// </param>
 private static void AddClass(System.Type aType, CellFactoryProviderAttribute aAttr)
 {
     CellHandlers.Add(new CellFactoryInvokerClass(aType, aAttr));
 }
		/// <summary>
		/// Adds class to list of factory provider handlers
		/// </summary>
		/// <param name="aType">
		/// Factory type <see cref="System.Type"/>
		/// </param>
		/// <param name="aAttr">
		/// Attribute <see cref="WidgetFactoryProviderAttribute"/>
		/// </param>
		private static void AddClass (System.Type aType, CellFactoryProviderAttribute aAttr)
		{
			CellHandlers.Add (new CellFactoryInvokerClass (aType, aAttr));
		}