anchor.diff:        }.toString();
   }
   
  +/// Required members to use [MenuItemMixin].
  +abstract class _MenuItemBase {
  +  Function get action;
  +  Icon get icon;
  +  String get label;
  +  String get secondaryLabel;
  +  String get tooltip;
  +  MenuModel get subMenu;
  +}
  +
  +/// Mixin to implement trivial getters on [MenuItem].
  +abstract class MenuItemMixin implements _MenuItemBase {
  +  void _noop() {}
  +  Function get nullAwareActionHandler => action != null ? action : _noop;
  +
  +  bool get hasIcon => icon != null;
  +
  +  String get uiDisplayName => label;
  +
  +  Icon get uiIcon => icon;
  +
  +  bool get hasSubMenu => subMenu != null;
  +
  +  bool get hasSecondaryLabel => secondaryLabel != null;
  +
  +  bool get showTooltip => isNotEmpty(tooltip);
  +}
  +
   /// Type that can be specified to mark that there can be no subMenus for
   /// a given [MenuItem].
   abstract class NullMenuItem extends MenuItem<NullMenuItem> {
  
positive.code:   /// Additional CSS classes to be attached to the root menu item element.
    final BuiltList<String> cssClasses;
  
    void _noop() {}
    Function get nullAwareActionHandler => action != null ? action : _noop;
  
    @virtual
    bool enabled;
    bool get hasIcon => icon != null;
  
    bool get hasSubMenu => subMenu != null;
    bool get showTooltip => isNotEmpty(tooltip);
    @override
    String get uiDisplayName => label;
    bool get hasSecondaryLabel => secondaryLabel != null;
  
    /// The constructor for a [MenuItem] which displays [label].
    ///
  
negative.code:   Function action;
  
    final Icon icon;
  
    /// List of rendered suffixes for this menu item.
    final ObservableList<MenuItemAffix> itemSuffixes;
  