How to detect pinout at run-time
pins_arduino.h has some standard macros that can be used for some of what you're looking to do. Using the arduino:standard variant used by Uno for example:

https://github.com/arduino/Arduino/blob/1.8.1/hardware/arduino/avr/variants/standard/pins_arduino.h#L35:

#define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)


Or if you want to use your naming scheme:

#define supportsPWM(p) digitalPinHasPWM(p)


After that it gets a bit more sketchy:

https://github.com/arduino/Arduino/blob/1.8.1/hardware/arduino/avr/variants/standard/pins_arduino.h#L28

#define NUM_DIGITAL_PINS 20


So, assuming that Arduino digital pins will always be numbered consecutively from 0 and any pin that supports digital input also supports digital output(which is the case in any variant I'm familiar with), you could use that to write some macros:

#define supportsDigitalInput(p) ((p) &lt; NUM_DIGITAL_PINS)
#define supportsDigitalOutput(p) supportsDigitalInput(p)


https://github.com/arduino/Arduino/blob/1.8.1/hardware/arduino/avr/variants/standard/pins_arduino.h#L29

#define NUM_ANALOG_INPUTS 6


Could be used to write this macro(with numbering assumption):

#define supportsAnalogInput(p) ((p) &lt; NUM_ANALOG_INPUTS)


Note that this will not work for the An analog pin names(e.g. A0 vs 0).

As for:

props.supportsAnalogOutput();
props.analogInputBits();
props.analogOutputBits();
props.pullupResistance();
props.pulldownResistance();


I'm don't know of pre-existing code for those. There is probably a way to get it for the first three in an architecture specific manner. The last two you'd most likely need to get the information from datasheets for all of your target microcontrollers and define then using processor specific macros.