Data is passed through module input and output ports
Each port accepts or outputs only one type
Users can add new types