protocol add function