def METHOD_NAME(self):
    self.n = int(self.n)
    self.m = int(self.m)
    points = self.get_shape()
    ctrls = np.zeros((self.n, self.m, 3)) 
    for i in range(self.n):
        for j in range(self.m):
            p = i / (self.n - 1)
            theta = 2 * pi * j / (self.m)
            ctrls[i][j][0] = self.scale(p) * points[j][0] + self.transform(p)
            ctrls[i][j][1] = self.scale(p) * points[j][1] # + self.transform(p)
            ctrls[i][j][2] = p + self.down(p, theta)
            ctrls[i][j][0] *= self.sx
            ctrls[i][j][1] *= self.sy
            ctrls[i][j][2] *= self.sz
    method = 'blender' if False else 'geomdl'
    obj = nurbs_util.nurbs(ctrls, method, face_size=0.01)
    obj = self.make_face(obj)
    top_pos = mathutils.Vector(ctrls[-1].mean(axis=0))
    with butil.CursorLocation(top_pos), butil.SelectObjects(obj):
        bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
    obj.location = (0,0,0)
    obj.rotation_euler.y -= np.pi / 2
    butil.apply_transform(obj, rot=True)
    tag_object(obj, 'hoof')
    return obj