StringDerivedProperty extends PropertyWrapper<T> { @Override protected final void propertyChanged() { propertyChangedInternal(); propertyChanged(getValue()); } StringDerivedProperty(String propName, T defaultValue, Function<String, T> decoder); @Override T getValue();  }
@Test public void testPropertyChanged() { final AtomicBoolean derived = new AtomicBoolean(false); final String defaultVal = "hi"; StringDerivedProperty<String> p = new StringDerivedProperty<String>("com.netflix.hello", defaultVal, new Function<String, String>() { @Override public String apply(String input) { derived.set(true); return String.format("%s/derived", input); } }); assertEquals(defaultVal, p.getValue()); ConfigurationManager.getConfigInstance().setProperty("com.netflix.hello", "archaius"); assertTrue("derive() was not called", derived.get()); assertEquals(String.format("%s/derived", "archaius"), p.getValue()); }