djRivet.mel (inspired by Michael Bazhutkin's excellent rivet.mel) uses follicles to constrain objects to a surface (poly or nurbs). First select one or more objects and last select target surface. Run djRivet to place follicles on the surface at the closest point to each of the selected objects. The objects are parent-constrained to the follicles (with maintain offset on) so they will stick to the surface and follow it if it is deformed.
Follicles are attached to a surface at a specified uv-coordinate, which can be changed or animated. This gives you the possibility to fine-tune the placement of your object by either adjusting the uv mapping (in the case of polys) or by changing uv parameter in the follicle attributes (polys or nurbs). As long as the uv's remain meaningful it is also possible to change the surface topology without breaking the connection to your object (for example you may want to smooth the poly mesh, split some faces, or add some iso's).
The dependency on uv's means that for polys djRivet.mel works best when your mesh has well layed out, non-overlapping uv's.
Even though follicles are used by the maya hair system, no hair systems are created by djRivet.mel. Only the stand-alone follicle node is used.
At this time I have only tested djRivet.mel with maya 8 (unlimited) on windows.
Let me know if you find it useful, or have any suggestions about making it better.