protected override bool SpecificMatches(RoleCompositionMember member)
 {
     if (!(member.Definition is MethodDefinition)) return false; // non-methods are not grouped
       var controlMethod = Members[0];
       return MethodMatcher.IsSignatureMatch(
     (MethodDefinition)member.ResolveContextualDefinition(),
     (MethodDefinition)controlMethod.ResolveContextualDefinition());
 }
 /// <summary>
 /// Checks if a member matches the condition to be part of this conflict group.
 /// </summary>
 /// <remarks>
 /// The member will always match a group that it's already part of.
 /// For an empty group, the method <see cref="MatchesEmptyGroup"/> is called.
 /// The member won't match if it's a hidden member. Hidden members can't conflict with other members.
 /// The method <see cref="SpecificMatches"/> is called to check this group's condition.
 /// </remarks>
 /// <param name="member">Member to check for a match.</param>
 /// <returns>If the member matches this group's condition.</returns>
 public bool Matches(RoleCompositionMember member)
 {
     if (member == null) throw new ArgumentNullException("member");
       if (Members.Count == 0) return MatchesEmptyGroup(member);
       if (MemberMatcher.IsMatch(Members[0].ResolveContextualDefinition(), member.ResolveContextualDefinition())) return true;
       if (member.Definition.IsHidden(Module)) return false;
       return SpecificMatches(member);
 }
 /// <summary>
 /// Adds a member to this conflict group. It will fail if the member doesn't
 /// match the group's condition.
 /// </summary>
 /// <param name="member">Member to add to this group.</param>
 public void AddMember(RoleCompositionMember member)
 {
     if (member == null) throw new ArgumentNullException("member");
       if (Members.Contains(member)) return;
       // TODO: rename matches to accepts?
       if (!Matches(member)) throw new ArgumentException("member doesn't match group");
       Members.Add(member);
 }
 protected override bool MatchesEmptyGroup(RoleCompositionMember member)
 {
     return member.Definition is MethodDefinition;
 }
 protected override bool SpecificMatches(RoleCompositionMember member)
 {
     return member.Definition.Name == Members[0].Definition.Name;
 }
 public void SetUp()
 {
     var targetType = GetType<Class_With_Property>();
       _member = new RoleMember(targetType, targetType.Properties[0]);
       _group = new MethodSignatureConflictGroup();
 }
 private void AddRoleMember(TypeReference role, RoleCompositionMember member)
 {
     Container.AddMember(member);
 }
 protected override bool SpecificMatches(RoleCompositionMember member)
 {
     // TODO: other things that don't match anything: constructors?
       return MemberMatcher.IsMatch(Members[0].ResolveContextualDefinition(), member.ResolveContextualDefinition());
 }
 /// <summary>
 /// Runs the specific condition logic for this conflict group,
 /// to be defined by subclasses.
 /// </summary>
 /// <param name="member">Member to match.</param>
 /// <returns>If the member matches this group's condition.</returns>
 protected abstract bool SpecificMatches(RoleCompositionMember member);
 /// <summary>
 /// Called to decide if a member can be part of an empty group, that is, 
 /// without considering other members. This is the initial condition for a
 /// member to be part of this group. By default returns <c>true</c>.
 /// </summary>
 /// <param name="member">Member to check.</param>
 /// <returns>If the member should be part of an empty group.</returns>
 protected virtual bool MatchesEmptyGroup(RoleCompositionMember member)
 {
     return true;
 }
 private IMemberDefinition ImplementMember(string name, RoleCompositionMember roleMember, IEnumerable<RoleCompositionMember> overrides, MethodAttributes accessSpecifier)
 {
     _name = name;
       _roleMember = roleMember;
       _overrides = overrides;
       _accessSpecifier = accessSpecifier;
       return ImplementMember();
 }
        private void ImplementBaseMethod(RoleCompositionMember typeMember, IEnumerable<RoleCompositionMember> overrides)
        {
            Tracer.TraceVerbose("Implement base method: {0}", typeMember.Definition);

              string baseMethodName = NameProvider.GetOriginalBaseMethodName(typeMember.Definition.Name);
              ClassMember baseMember = null;
              var currentType = TargetType.BaseType;
              do {
            var finder = new MemberFinder(currentType.Resolve());
            var foundBase = finder.FindMatchFor(typeMember.Definition, baseMethodName);
            if (foundBase != null) {
              baseMember = new ClassMember(currentType, foundBase, isInherited: true);
              break;
            }
            currentType = currentType.Resolve().BaseType;
              } while (currentType != null);
              if (baseMember == null) throw new InvalidOperationException();

              // TODO: refactor with AdjustSupercedingMember!
              var method = (MethodDefinition)typeMember.Definition;
              var targetMethod = new MemberResolver(baseMember.Class, Module).ResolveMethodDefinition(method, method.Name, MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.HideBySig);
              CreateCodeToCallBaseClassMethod(targetMethod, baseMember);
              TargetType.Methods.Add(targetMethod);
              AddOverrides(targetMethod, overrides);
        }