For background, consider an implementation of StyleableProperty and CssMetaData as it is now.
public class MyButton extends Button { public BooleanProperty fooProperty() { return (BooleanProperty)foo; } private StyleableProperty<Boolean> foo = new SimpleStyleableBooleanProperty(fooMetaData); private static final CssMetaData<MyButton,Boolean> fooMetaData = new CssMetaData<>("-my-foo", StyleConverter.getBooleanConverter()) { @Override public boolean isSettable(MyButton node) { return !node.fooProperty().isBound(); } @Override public StyleableProperty<Boolean> getStyleableProperty(MyButton node) { return node.foo; } }; static final List<CssMetaData<? extends Styleable, ?>> cssMetaData; static { List<CssMetaData<? extends Styleable, ?>> temp = new ArrayList<>(Control.getClassCssMetaData()); temp.addAll(Arrays.asList(fooMetaData)); cssMetaData = Collections.unmodifiableList(temp); } @Override public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() { return cssMetaData; } }
From the high-level view, there are two pieces here. First is the StyleableProperty which is used by CSS to set the calculated value of a style on a property. The second piece is the CssMetaData which is used by CSS to (primarily) discover what css properties to look up for a node (e.g., -fx-fill), and to get the StyleableProperty for setting the value (e.g., get the StyleableProperty that corresponds to -fx-fill).
With StyleablePropertyFactory, the same can be accomplished in fewer lines of code.
public class MyButton extends Button { private static final StyleablePropertyFactory<MyButton> FACTORY = new StyleablePropertyFactory<>(Button.getClassCssMetaData()); public BooleanProperty fooProperty() { return (BooleanProperty)foo; } private StyleableProperty<Boolean> foo = new Factory.createStyleableBooleanProperty(this, "foo", "-my-foo"); @Override public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() { return cssMetaData; } }