One option would be to just use launchd. Save a property list like this as
~/Library/LaunchAgents/com.superuser.445907.plist, and load it with
launchctl load ~/Library/LaunchAgents/com.superuser.445907.plist or by logging out and back in.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
<string>/Users/username/script</string> <!-- ~/ doesn't work -->
<integer>0</integer> <!-- run at most every 0 seconds, by default 10 -->
Launchd only registers changes to files when they are saved atomically, or deleted and recreated every time they are saved. Most OS X applications perform atomic saves by default, but for example TextMate and vim don't. Changes in subfolders of watched folders aren't detected.
launchctl unload $path && launchctl load $path applies changes to a plist.
man launchd and
man launchd.plist for more information.