Итак, учитывая, что у меня есть экземпляр этого компонента:
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
фактической ссылки на содержащий объект.
Обновление Как подсказал Мика в комментариях, я добавил к этому тег "Java", так как подозреваю, что он может быть прав в том, что решение может заключаться в использовании Java для самоанализа.
Обновление
Вместо того чтобы оставить это как чисто академическое обсуждение, позвольте мне объяснить, зачем мне это нужно.
Я использую CFWheels ORM с включениями, чтобы получить ссылки на мои данные, например:
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.AuthSource.authenticate(user, password) // note the redundancy in the use of "user"
Я должен иметь возможность полагаться на тот факт, что я вызываю метод в модели AuthSource через объект User и фактически читаю из этого объекта из этого метода.