protected virtual bool NameMatch(MethodSignature signature, MethodInfo method, PointCutFlags flags)
		{
			String sign = signature.MethodName;
			String name = method.Name;

			if (sign.IndexOf('*') != -1)
			{
				return Regex.IsMatch(name, sign);
			}
			else if ((method.IsSpecialName && (((int) (flags & PointCutFlags.Property)) != 0)) ||
				(name.StartsWith("get_") && (((int) (flags & PointCutFlags.PropertyRead)) != 0)) ||
				(name.StartsWith("set_") && (((int) (flags & PointCutFlags.PropertyWrite)) != 0)))
			{
				name = name.Substring(4);
			}

			return name.Equals(sign);
		}
		protected virtual bool AccessMatch(MethodSignature signature, MethodInfo method)
		{
			if (signature.AllAccess)
				return true;

			return ((signature.Access == "public" && method.IsPublic) ||
				(signature.Access == "private" && method.IsPrivate) ||
				(signature.Access == "internal" && method.IsAssembly));
		}
		protected virtual bool ReturnTypeMatch(MethodSignature signature, MethodInfo method)
		{
			if (signature.AllRetTypes)
			{
				return true;
			}

			return TypeMatch(signature.RetType, method.ReturnType);
		}
		protected virtual bool ArgumentsMatch(MethodSignature signature, MethodInfo method)
		{
			if (signature.AllArguments)
			{
				return true;
			}

			String[] arguments = signature.Arguments;
			ParameterInfo[] parameters = method.GetParameters();

			for (int i = 0; i < arguments.Length; i++)
			{
				String argName = arguments[i];

				if (argName.Equals("*"))
				{
					break;
				}
				else if (i == parameters.Length)
				{
					return false;
				}
				else if (i == arguments.Length - 1 && arguments.Length != parameters.Length)
				{
					return false;
				}

				if (!TypeMatch(argName, parameters[i].ParameterType))
				{
					return false;
				}
			}

			return true;
		}