Thank you everyone for some great responses!

While I've been the lead developer in many projects I've only been in business a little over a year.  Im still learning a lot of things the hard way.  I learned a few things from this project; so even if I have to send this guy to collections or am forced to sue him,
It was a valuable experience.

I made a few mistakes with this guy..
For those reasons I said I'd do it on an hourly basis and bill him periodically.  Later in the game he wants to shift to a milestone based billing, essentially one HUGE milestone that includes half of his project.  He already owes me for 56 hours of work, the rest of the project if all goes well should take another 20 hours.  It's a lot of money to my small company to be at risk.  What really makes me nervous is that he doesn't even want to pay half of what he currently owes me.  This project has made me realize that I can't take on another project before I get some contracts created that spell out my terms. 

The project in question is an Internet application modification project.  The $99 software he wanted it based on was junk.  Despite my recommendations to pick something else due to scalability and design issues, he wanted to stick with it. It's a Perl CGI web application with ton's of SQL calls per page, REALLY screwy template and variable 'mazes' in the code, and zero documentation related to the code itself.  Making modifications to it is very time consuming compaired to a project you'd download on sourceforge.  Having the source code and being 'open source' are two different things.  With an open source project you have people to turn to when you find code that doesn't follow typical design methodologies.  

Heres a breakdown of a typical line of code from this code, I sent this to the client to explain the issues I was having :
Heres one line from bidding.pm in AccountMgr.pm:
    $Template =&Translate_File($Global{BiddingList_Template});
The above line looks innocent enough until you try to figure out what it's loading:

Searching through the code I eventually find this line in Configuration.pm:
$Global{BiddingList_Template} = "$Global{Template_Dir}/BiddingList.html";

Looking up $Global{Template_Dir}I eventually find this line:
$Global{Template_Dir} = "$Global{Templates_Dir}/$Global{Theme}";

Now there are two variables to decode ($Global{Templates_Dir} and $Global{Theme}
$Global{Templates_Dir} = "$Global{Data_Dir}/templates

Ok.. now I have to look up $Global{Data_Dir}
$Global{Data_Dir} = "$Global{CGI_Dir}/data
This isn't defined specifically anywhere I can find with grep.. but must be /cgi-bin/auction/

Now theres $Global{Theme}
$Global{Theme} = $Themes{$Global{Language}};

Now theres $Global{Language}
$Global{Language} = $Cookies{User_Language}
Cant find this anywhere.. but it must be English.
That leaves $Themes{English}

I finally find this line:
$Themes{$Lang} = $Theme;
Another line in Configuration.pm: ($Lang, $Theme) = split(/\:/, $Line);
and $Line comes from $Global{Themes}
And finally in Defaults.pm I find that line:
Defaults.pm:    $Global{Themes} = "English:Default";
The above line is splitting $Global{Themes} on ':' into $Lang and $Theme.

So what file is it loading?? :)
It's loading: /cgi-bin/auction/data/tempates/Default/BiddingList.html
Then theres the function that's processing the file: Translate_File
DisplayMgr.pm: Translate_File 
All that does is load the whole file into a string, simple enough once you figure out all the layers of BS to get there.
.
Thats just one line.
I hate when people write code like this; it's almost like the author purposefully made it obscure though perl makes that an easy task  (grin)


On that note.. did that person that was looking for the Perl list  like this one find one?

JD

-- 
JD Austin
Twin Geckos Technology Services LLC
email: jd@twingeckos.com
http://www.twingeckos.com
phone/fax: 480.344.2640