static bool IsBase (MethodReference method, MethodReference mr)
		{
			if (mr.Name != method.Name)
				return false;

			if (!mr.CompareSignature (method))
				return false;

			foreach (TypeDefinition baseType in method.DeclaringType.AllSuperTypes ()) {
				if (mr.DeclaringType.FullName == baseType.FullName)
					return true;
			}
			return false;
		}
		static bool IsBase (MethodReference method, MethodReference mr)
		{
			if (mr.Name != method.Name)
				return false;

			if (!mr.CompareSignature (method))
				return false;

			TypeReference type = mr.DeclaringType;
			foreach (TypeDefinition baseType in method.DeclaringType.AllSuperTypes ()) {
				if (baseType.IsNamed (type.Namespace, type.Name))
					return true;
			}
			return false;
		}
        private static bool SignatureMatches(MethodReference method, MethodReference baseMethod, bool explicitInterfaceCheck)
        {
            string name = method.Name;
            string base_name = baseMethod.Name;

            if (name != base_name) {
                if (!explicitInterfaceCheck)
                    return false;

                TypeReference btype = baseMethod.DeclaringType;
                string bnspace = btype.Namespace;
                if (!name.StartsWith (bnspace, StringComparison.Ordinal))
                    return false;
                if (name [bnspace.Length] != '.')
                    return false;

                string bname = btype.Name;
                if (String.CompareOrdinal (bname, 0, name, bnspace.Length + 1, bname.Length) != 0)
                    return false;

                int dot = bnspace.Length + bname.Length + 1;
                if (name [dot] != '.')
                    return false;

                if (name.LastIndexOf (base_name, StringComparison.Ordinal) != dot + 1)
                    return false;
            }
            return method.CompareSignature (baseMethod);
        }
		private static bool CompareMethods (MethodReference method1, MethodReference method2, bool virtual_call)
		{
			if (method1 == null)
				return (method2 == null);
			if (method2 == null)
				return false;

			// shortcut, if it's not virtual then only compare metadata tokens
			if (!virtual_call)
				return (method1.MetadataToken == method2.MetadataToken);

			// we could be implementing an interface (skip position 0 because of .ctor and .cctor)
			string m1name = method1.Name;
			bool explicit_interface = (m1name.IndexOf ('.') > 0);
			if (!explicit_interface && (m1name != method2.Name))
				return false;

			// compare parameters
			if (!method1.CompareSignature (method2))
				return false;

			TypeReference t2 = method2.DeclaringType;
			TypeDefinition t2r = t2.Resolve ();
			if (!explicit_interface && (t2r != null) && !t2r.IsInterface)
				return true;

			string t2name = t2.FullName;
			// we're calling into an interface and this could be us!
			foreach (MethodReference mr in method1.Resolve ().Overrides) {
				if (t2name == mr.DeclaringType.FullName)
					return true;
			}
			return false;
		}