Void Main wrote:I've done a lot of C but I'll never learn C++ I am afraid. I'm just not an object oriented kind of guy. I guess Perl-Tk is somewhat object oriented though.

perl, as a whole, is object oriented. Your use of the Math::Trig perl module was an object oriented program logic. Sending a specific function input and collecting the output is the basics of OOP. The class (package) was the Math::Trig module while great_circle_distance() and deg2rad() are two methods used by the class. Even my usage of calculate() is OOP styled subroutine. It takes input and generates usable output. I can change the internal workings of how the calculations are performed or in what order they are performed and as long as the output is still accurate then this change would be transparent to the user. But my function is not part of a usable class (package), so it can not be called by other applications for use so this would declassify it as being completely OOP, but the idea is the same and I could easily create a class and add this method to it as is and it would then be total OOP. OOP is the exact idea behind most module/package usage in perl.
A few easy ways of deciding if a specific function or package can be classified as OOP is:
1) Is there a "black box" style of input and output?
Meaning do you have to know the innards of a function to successfully generate usable output. If so, it is probably not OOP.
2) Can the way the function parses the input and generates the output be changed to adapt to more situations or become more optimized without affecting the input or output?
If not, then it is probably not an OOP styled function. In OOP, you should be able to change the way the data is processed internally without breaking exisitng programs out there that may already be using your object.
3) Does the class/object have the ability to be abstracted?
To have abstraction in a class means that the class can be used as part of a bigger whole and "just work".
1 and 2 above are considered properties of "Encapsulation" in OOP terms.
3 of course deals with Abstraction
Polymorphism is also a largely debatable aspect of OOP style logic. This is an OOP method's capability to generate different output depending on the class instantiation it was called in. This idea to me is just sending the method different input to get taylored output. You can "instantiate" an object in different classes all you want, but if you send the wrong input you will get the wrong output.
I am not saying that Polymorphism is not an aspect of OOP, I am just questioning the need to define it as such. Seems common sense to me that if you send a function or method different input you will get different output. That is just my opinion.