A lot of my thinking came from Javascript, PHP and Jquery.
In Javascript a function IS A object-- in fact everything is an object in javascript.
CFML is sort of the same, although it does not have anon functions yet.
I really like how PHP/JS lets you use OO all in one script, CFML makes it seem like OO is all about CFC's-- which it is NOT. OO is about encapsulation.
I think if you could use CFML like PHP/JS and create script objects then run them all in the same script, the concepts would be much simpler to grasp.
It is too easy to get bogged down in how the objects are interacting instead of what they are actually doing.
The more I look at OOP in general, the more I realize that the concepts strengths are not just because you put all your methods into a service/bean, but in the fact that you are looking at single name-spaced entities with multiple variables as an encapsulated container with methods.
In CFML a Struct() is still on object, a Hash Map if I recall, so I could not get past the reasons why OOP was using a bean just to do what a Struct() was already doing, albeit with no methods.
Once I started developing plugins for jquery, and learning how to use prototypes and name-spacing correctly, it really improved how I did OO in CFML.
I just began to realize that I was thinking about how to get things to work in OO way too hard, and not concentrating on what the actual code was doing.
I ended up with procedural code in a service, with beans and querys being passed around then returning a bean that only contained a struct() of my processed variables.
One day I read something you wrote about Rich beans vs Anemic and it really opened my eyes to what I was doing, All I was doing was making my code more complex, and the actual muscle in my code was doing exactly the same thing it would do if it were all procedural, only now its in a service, and my beans knew nothing about anything.
I had all of the complexity of OO and none of the benefits of rich beans.
So, I adopted a better approach by making sure that I encapsulate all my routines, and I test them all separate from my services and frameworks. I let my beans have all the sunlight and nutrients they needs to get the job done, and I only give my beans code that has been tested.
As the bean matures I move some functions to the service layer.
It really does not matter where the CFML runs, it always does the same thing-- what matters is if you are really paying attention to how much each method is doing, and trying to break stuff down into simple methods rather than on HUGE method that procedurally processes a huge chunk of logic.
(i just typo-ed "methgods", which is prob a good interpretation of what I was doing wrong-- instead of "GOD" objects, I had "GOD" methods.)
I really try to not follow the "herd" on most things, I know there are benefits and problems with every approach. I try to fit only things that I can truly understand into my workflow.
I think that above all is the most important thing, understand what you are doing-- don't just use the latest greatest concepts just because.
The most issues I see people having is when something breaks in a complex system, and they cannot figure out why-- "my framework ate my error".
I say Test, test, test-- THEN assemble.