public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors) { if (state.GetContext <EntityEnhancementHint>() == null) { return(visitor); } IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(state.OriginalType, true); if (metaData == null) { return(visitor); } if (!IsAnnotationPresent <EntityEqualsAspect>(state.CurrentType)) { return(visitor); } visitor = new InterfaceAdder(visitor, typeof(IEntityEquals), typeof(IPrintable)); visitor = new GetIdMethodCreator(visitor, metaData); visitor = new GetBaseTypeMethodCreator(visitor); visitor = new EntityEqualsVisitor(visitor); return(visitor); }
public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors) { if (state.GetContext <EntityEnhancementHint>() == null) { return(visitor); } bool lastBehaviorStanding = remainingPendingBehaviors.Remove(this); Type currentType = state.CurrentType; if (!typeof(INotifyPropertyChanged).IsAssignableFrom(currentType)) { if (remainingPendingBehaviors.Count == 0 && lastBehaviorStanding) { // The type is not being PropertyChange enhanced. return(visitor); } if (remainingPendingBehaviors.Count == 0 && cascadePendingBehaviors.Count == 0) { // Mark "last behavior standing" to avoid infinite loop cascadePendingBehaviors.Add(this); } cascadePendingBehaviors.Add(this); return(visitor); } IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(state.OriginalType); visitor = new GetIdMethodCreator(visitor, metaData); visitor = new SetBeanContextMethodCreator(visitor); CascadeBehavior cascadeBehavior = BeanContext.RegisterWithLifecycle(new CascadeBehavior(metaData)).Finish(); cascadePendingBehaviors.Add(cascadeBehavior); return(visitor); }