final void attach()

in mapper/src/main/java/jetbrains/jetpad/mapper/Mapper.java [157:211]


  final void attach(MappingContext ctx) {
    if (myMappingContext != null) {
      throw new IllegalStateException("Mapper is already attached");
    }
    if (myState != State.NOT_ATTACHED) {
      throw new IllegalStateException("Mapper can't be reused because it was already detached");
    }

    try {
      onBeforeAttach(ctx);
    } catch (Throwable t) {
      ThrowableHandlers.handle(t);
    }

    myState = State.ATTACHING_SYNCHRONIZERS;
    myMappingContext = ctx;

    instantiateSynchronizers();

    myMappingContext.register(this);

    for (Object part : myParts) {
      if (part instanceof Synchronizer) {
        Synchronizer s = (Synchronizer) part;
        s.attach(new SynchronizerContext() {
          @Override
          public MappingContext getMappingContext() {
            return myMappingContext;
          }

          @Override
          public Mapper<?, ?> getMapper() {
            return Mapper.this;
          }
        });
      }
    }

    myState = State.ATTACHING_CHILDREN;
    for (Object part : myParts) {
      if (part instanceof ChildContainer) {
        for (Mapper<?, ?> m : (ChildContainer<?>) part) {
          m.attach(ctx);
        }
      }
    }

    myState = State.ATTACHED;

    try {
      onAttach(ctx);
    } catch (Throwable t) {
      ThrowableHandlers.handle(t);
    }
  }