custom preprocessor