implement userdata. closes #9