very messy and fragile, but it works