fully implemented some metamethods