You can find the line number that the func was defined in and reparse the source. I do this in quite a few decorators that need source.
The other option is to wrap the thing decorated in a doc string
@fancy_source_needing_decorator
def foo(s):
"""
put some haskell or DSL stuff in here
"""
Then you don't have to reparse the source, etc etc, but it still gets packaged as a function.