I want to build a well-tiered application. I have a Data Access Layer CFC
containing only functions/methods with contain my SQL to my database, no
problem. Now I want to build the business object layer with rules including
validation that cannot be skipped by any UI layer that calls it.

Pseudo-Code example of Use
'instatiate persistent object
1. <cfobject component="mypath.compnents.user_bizobj" name="user">

'set properties
2. <cfset user.ID = "1234">
3. <cfset user.fname = "John">
4. <cfet user.lname ="Doe">

'call method to do work
5. <cfinvoke component="#user#" method="Store"> 'which invokes the data access
CFC

My problem is that I want to do validation in the cfset steps (2.,3.,4.)

My understanding of object orientation theory says that insted of using
inside the CFC
<cfset This.ID="">
<cfset This.fname="">
<cfset This.Iname="">

That I want something like
<cfset _local_ID="">

<cfproperty name="ID">
<set >
<cfif (arg1.value GT 0) AND (arg1.value LT 9999)>
<cfset _local_id = arg1.value>
</cfif>
</set>

<get>
<cfreturn _local_ID>
</get>
</cfproperty>

I know that this use of cfproperty is not valid and that my set-ers and
get-ers do not exists. Has someone come up with a best practices way to do this
kind of thing.

Issues:
Using "This" scope is totally unacceptable. It creates public variable on my
CFC that can be set directly.

I can use a mehod for the get-ers. They have a return value.
For instance if fname is a method with a return value
<cfset app_fname = user.fname> works.

But then how do I do the set ?
<cfset user.fname = Form.fname>
does not work when fname is method of my CFC.

This apparent lack of facility is pushing me to put the validation back in
the UI, and invoke the Business Object as a dumb portal to the Data Access
Layers. That can't be right. What is a business object tier for if I can't put
the business rules logic in it.