Hi Andrus,

Thanks for taking a look at this. The only part where I noticed method naming 
directly affecting my own work is #3, since I tend to do a lot of in-memory 
sorting and filtering of collections of Persistents based on their 
attributes/Properties. Although I also vaguely remember random errors popping 
up which may then have been due to #4.

So definitely taking that lovely red pill! :)

Cheers,
- hugi



> On 2 Feb 2025, at 15:00, Andrus Adamchik <aadamc...@gmail.com> wrote:
> 
> Hi Hugi,
> 
> I haven't looked at this code in a while, but the framework was designed to 
> use Persistent interface methods (readPropertyDirectly(..), 
> writePropertyDirectly(..) and so on) to access object state, not reflection. 
> With PropertyUtils and BeanAccessor we veered of that course. Here are a few 
> BeanAccessor scenarios I dug up:
> 
> 1. Persistent.readNestedProperty(..) for non-persistent properties 
> 2. In-memory expression evaluation on POJOs
> 3. In-memory expression evaluation on Persistent objects
> 4. Reading "persistentState" property from a Persistent object
> 
> Most apps hopefully don't care for #1 & #2. (those were cool features before 
> Java streams. Now they are not very useful, and I would argue, out of scope 
> for Cayenne. But they are not harmful either and can remain. #3 & #4 are just 
> incorrect implementations and should be changed. We should not be using 
> reflection where Persistent interface is present. 
> 
> I may be missing more cases, but you see where I am getting with this. After 
> some cleanup, Cayenne would not care whether you call your getters "getXyz()" 
> or "xyz()", and what you propose becomes purely a task of writing a custom 
> template. And with 5.0 improvements, templates can be stored in your project 
> and managed by the Modeler. So I suggest we focus on this cleanup.
> 
> To quote The Matrix, when we are ready, we won't have to dodge bullets.
> 
> Andrus
> 
> 
>> On Feb 2, 2025, at 7:38 AM, Hugi Thordarson <h...@karlmenn.is> wrote:
>> 
>> Hi all!
>> 
>> With 5.0 under development, I’d like to re-awaken an old proposal.
>> 
>> When Cayenne generates classes, you’ll by default get JavaBean style 
>> prefixes for attribute/relationship method names (“get” and “is”). I've 
>> never used those and really don't want class generation to affect my method 
>> names, so I use my own superclass template that does not include those 
>> prefixes and patch in my own “BeanAccessor” (which is used by Cayenne to 
>> invoke class methods) that assumes the prefixes are not present.
>> 
>> Since I finally have time to do some Cayenne advocacy, I’m finding it feels 
>> hacky to instruct folks to drop in a patch if they don’t want the method 
>> name prefixes — so I’d like to propose that allowing classes to have 
>> non-prefixed method names be made an option in the Cayenne core.
>> 
>> I’d submit a pull request, but I don’t think I’m the best to propose how to 
>> go about this. I change the behaviour myself by invoking 
>> PropertyUtils.installAccessorFactory() with my own implementation ( 
>> https://gist.github.com/hugithordarson/0367e4e9672df95559d331f072597662 ) 
>> (that has to be in the package it is, since it relies on package protected 
>> functionality from Cayenne) but I guess a more friendly way (if not a 
>> configuration option) would be to make the BeanAccessor injectable.
>> 
>> I don't think I’ll propose adding non-prefixed templates in the core as well 
>> — adding one's own class generation template to a project feels much more 
>> “normal” than dropping in a “hack class” to make things work. But just 
>> having the functionality of NonPrefixedBeanAccessor available in core would 
>> be a definite improvement.
>> 
>> Furthermore, Carthago delenda something something :D
>> 
>> Cheers,
>> - hugi
> 

Reply via email to