Как определить контекст, в котором находится объект ColdFusion?

Итак, учитывая, что у меня есть экземпляр этого компонента:

foo.cfc

<cfcomponent>
  <cffunction name="locateMe">
    <cfreturn "I don't know where I live!">
  </cffunction>
</cfcomponent>

И другой компонент, fooParent.cfc:

<cfcomponent>
  <cfset this.foo = createObject("component", "foo")>
</cfcomponent>

Допустим, я создаю экземпляры "foo" несколькими разными способами:

<cfset myStruct = {}>
<cfset myStruct.foo = createObject("component", "foo")>

<cfset myFoo = createObject("component", "foo")>

<cfset myFooParent = createObject("component", "fooParent")>

<cfoutput>
#myStruct.foo.locateMe()#<br>
#myFoo.locateMe()#<br>
#myFooParent.foo.locateMe()#<br>
</cfoutput>

Как и ожидалось, получается:

I don't know where I live!
I don't know where I live!
I don't know where I live!

Что я хочу знать, что я могу сделать в foo.cfc, что скажет мне что-то (хоть что-нибудь!) о контексте, в котором он вызывается? Поскольку все в конечном итоге живет в (по крайней мере) какой-то области видимости, а все области видимости являются своего рода объектами, то я хочу сказать, что мне бы очень хотелось иметь какой-то способ определить содержащий объект из данного инстанцированного объекта. В конечном счете, какой-то способ создания foo.cfc, чтобы что-то вроде этого могло быть моим результатом, из моего примера фрагмента выше:

I live within a "class coldfusion.runtime.Struct" instance!
I live within a "class coldfusion.runtime.VariableScope" instance!
I live within a "component cfjunk.fooParent" instance!

Где каждое из этих значений может быть определено путем осмотра результата передачи getMetaData фактической ссылки на содержащий объект.

Обновление Как предложил Micah в комментариях, я добавил тег "Java" к этому, поскольку я подозреваю, что он может быть прав в том, что решение может заключаться в использовании Java для интроспекции.

Обновление

Вместо того, чтобы оставить это в качестве чисто академической дискуссии, позвольте мне объяснить, зачем мне это нужно.

Я использую CFWheels ORM с include для получения ссылок на мои данные следующим образом:

var user = model("User").findOne(where="id=123", include="AuthSource", returnAs="object");

Это возвращает мне объект, на который я могу ссылаться следующим образом:

user.id // property of the "User" model
user.reset() // method on the "User" model
user.AuthSource.id // property of the "AuthSource" model
user.AuthSource.authenticate(password) // method on the "AuthSource" model

Теперь, внутри моего метода "AuthSource.authenticate", я хотел бы знать об объекте "User", в котором я нахожусь. В противном случае мне придется вызывать функцию следующим образом:

user.AuthSource.authenticate(user, password) // note the redundancy in the use of "user"

Я должен иметь возможность полагаться на тот факт, что я вызываю метод на модели AuthSource через объект User и фактически читать из этого объекта внутри этого метода.

11
задан Jeromy French 8 March 2013 в 14:48
поделиться