protected final void init(final ActionSystemPartDef def) {
    this.functionContext = initFunctionContext();

    if (def != null) {
      this.id = def.getId().content();

      final Function labelFunction =
          FailSafeFunction.create(def.getLabel().content(), Literal.create(String.class));

      this.labelFunctionResult = labelFunction.evaluate(this.functionContext);

      this.labelFunctionResult.attach(
          new Listener() {
            @Override
            public void handle(final Event event) {
              broadcast(new LabelChangedEvent());
            }
          });

      final Function toolTipFunction =
          FailSafeFunction.create(def.getToolTip().content(), Literal.create(String.class));

      this.toolTipFunctionResult = toolTipFunction.evaluate(this.functionContext);

      this.toolTipFunctionResult.attach(
          new Listener() {
            @Override
            public void handle(final Event event) {
              broadcast(new ToolTipChangedEvent());
            }
          });

      this.description = def.getDescription().content();

      for (ImageReference image : def.getImages()) {
        final Function imageFunction =
            FailSafeFunction.create(image.getImage().content(), Literal.create(ImageData.class));
        final FunctionResult imageFunctionResult = imageFunction.evaluate(this.functionContext);
        final ImageData data = (ImageData) imageFunctionResult.value();

        if (data != null) {
          this.images.add(data);
        }

        imageFunctionResult.dispose();
      }

      for (ActionLocationHint locationHintDef : def.getLocationHints()) {
        final String locationHintText = locationHintDef.getReferenceEntityId().content();

        if (locationHintText != null) {
          final SapphireActionLocationHint locationHint;

          if (locationHintDef instanceof ActionLocationHintBefore) {
            locationHint = new SapphireActionLocationHintBefore(locationHintText);
          } else if (locationHintDef instanceof ActionLocationHintAfter) {
            locationHint = new SapphireActionLocationHintAfter(locationHintText);
          } else {
            throw new IllegalStateException();
          }

          this.locationHints.add(locationHint);
        }
      }
    }

    this.enabled = true;
    this.visible = true;
  }