add 'immutable' coercion function and protocol