that is what is hard.  since you're doing method dispatch, you wind up really wanting to instance_eval a block, but then you have to be able to set default and override attrs based on weither you're in the context of the project opverrides or the software defn, and that is the problem that winds up reengineering a version of Chef::Node::Attribute in order to deal with it properly.  at that point I'd probably go with Dan's suggestion and re-engineer to project DSL to take a block instead of a symbol+hash as well.

so this is exactly why i was asking all the questions again...   arguably that's the more powerful way to extend the DSL, but i think YAGNI...