class Baseboard implements DynamicMBean, PropertiesAvailable {

    private oshi.hardware.Baseboard baseboard;
    private MBeanInfo dMBeanInfo = null;
    private List<String> propertiesAvailable = new ArrayList<>();
    private final String PROPERTIES = "Properties";

    private void setUpMBean() throws IntrospectionException, javax.management.IntrospectionException {<FILL_FUNCTION_BODY>}

    public Baseboard(oshi.hardware.Baseboard baseboard)
            throws IntrospectionException, javax.management.IntrospectionException {
        this.baseboard = baseboard;
        this.setUpMBean();
    }

    @Override
    public Object getAttribute(String attribute) {
        switch (attribute) {
        case PROPERTIES:
            return this.getProperties();
        case "Manufacturer":
            return baseboard.getManufacturer();
        case "Model":
            return baseboard.getModel();
        case "Version":
            return baseboard.getVersion();
        case "SerialNumber":
            return baseboard.getSerialNumber();
        default:
            throw new IllegalArgumentException("No attribute " + attribute);
        }
    }

    @Override
    public MBeanInfo getMBeanInfo() {
        return dMBeanInfo;
    }

    @Override
    public List<String> getProperties() {
        return propertiesAvailable;
    }

    @Override
    public void setAttribute(Attribute attribute)
            throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {

    }

    @Override
    public AttributeList getAttributes(String[] attributes) {
        return null;
    }

    @Override
    public AttributeList setAttributes(AttributeList attributes) {
        return null;
    }

    @Override
    public Object invoke(String actionName, Object[] params, String[] signature)
            throws MBeanException, ReflectionException {
        return null;
    }

}


        PropertyDescriptor[] methods = Introspector.getBeanInfo(baseboard.getClass()).getPropertyDescriptors();
        MBeanAttributeInfo[] attributeInfos = new MBeanAttributeInfo[methods.length];

        for (int i = 0; i < methods.length; i++) {
            attributeInfos[i] = new MBeanAttributeInfo(methods[i].getName(), methods[i].getShortDescription(),
                    methods[i].getReadMethod(), null);
            propertiesAvailable.add(
                    methods[i].getName().substring(0, 1).toUpperCase(Locale.ROOT) + methods[i].getName().substring(1));
        }

        dMBeanInfo = new MBeanInfo(baseboard.getClass().getName(), null, attributeInfos, null, null,
                new MBeanNotificationInfo[0]);
    
<no_super_class>