updated to not use eval()