Dear Chris,
I recently found some way in the sources of the Inspector using some
seemingly undocumented functor 'x-oz://boot/Object'. There are also
ways to get all attributes, or methods of a class (see class Reflection
below).
BTW: This class makes use of a function Boot_Name.newUnique, which
allows to "recreate" a name given an atom. I find it very handy to have
this for the reflection class below. But does this procedure not
impair the security intended to provide with names?
Best,
Torsten
%%%%%%%%%%%%%%%%%
%%
%% Retrieving class type
%%
[Boot_Object] = {Module.link ['x-oz://boot/Object']}
class Example meth init() skip end end
X = {New Example init()}
{Boot_Object.getClass X}
%%%%%%%%%%%%%%%%%
%%
%% Reflection class
%%
[Boot_Object Boot_Name] = {Module.link ['x-oz://boot/Object'
'x-oz://boot/Name']}
/** %% [abstract class] Defines reflection capabilities for objects.
Please note: this class uses undocumented Oz features, which are
possibly not intended for end users ;-)
%% */
class Reflection
meth getClass($)
{Boot_Object.getClass self}
end
/** %% Returns the print name of the class of self as specified
in its definition. The name is an atom derived from a variable and thus
starting with a capital letter, e.g., 'ScoreObject'.
%% */
meth getClassName($)
{self getClass($)}.{Boot_Name.newUnique 'ooPrintName'}
end
/** %% Returns a list of all attributes (atoms) defined for self.
%% */
meth getAttrNames($)
{Arity {self getClass($)}.{Boot_Name.newUnique 'ooAttr'}}
end
/** %% Alias for getAttrNames.
%% */
meth getAttributes($) {self getAttrNames($)} end
/** %% Returns a record where the features are the attributes
defined for self and the values are the classes which define these
attributes.
%% */
meth getAttrSources($)
{Dictionary.toRecord {self getClassName($)}
{self getClass($)}.{Boot_Name.newUnique 'ooAttrSrc'}}
end
/** %% Returns a list of all features (atoms) defined for self.
%% */
meth getFeatNames($)
{Arity {self getClass($)}.{Boot_Name.newUnique 'ooFeat'}}
end
/** %% Alias for getFeatNames.
%% */
meth getFeatures($) {self getFeatNames($)} end
/** %% Returns a record where the features are the features
defined for self and the values are the classes which define these
features.
%% */
meth getFeatSources($)
{Dictionary.toRecord {self getClassName($)}
{self getClass($)}.{Boot_Name.newUnique 'ooFeatSrc'}}
end
/** %% Returns a list of all methods (atoms) defined for self.
%% */
meth getMethNames($)
{Dictionary.keys {self getClass($)}.{Boot_Name.newUnique 'ooMeth'}}
end
/** %% Alias for getMethNames.
%% */
meth getMethods($) {self getMethNames($)} end
/* %% [TODO] Get the default arguments of the initialisation
method...
%% */
% meth getInitArgs($)
% end
/** %% Returns a record where the features are the methods
defined for self and the values are the classes which define these
methods.
%% */
meth getMethSources($)
{Dictionary.toRecord {self getClassName($)}
{self getClass($)}.{Boot_Name.newUnique 'ooMethSrc'}}
end
/** %% Returns the value at attribute A.
%% */
meth getAttr($ A) @A end
/** %% Returns the value at feature F.
%% */
meth getFeat($ F) self.F end
end
On 08.04.2007, at 05:50, Chris Rathman wrote:
Is there a way to get the class type of a variable? For example, if I
have a class like:
class Example meth init() skip end end
X = {New Example init()}
is there a method along the lines of:
% {Browse {X.getType()}}
Thanks,
Chris Rathman
_______________________________________________________________________
__________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users
--
Torsten Anders
Sonic Arts Research Centre • Queen's University Belfast
Frankstr. 49 • D-50996 Köln
Tel: +49-221-3980750
http://strasheela.sourceforge.net
http://www.torsten-anders.de
_________________________________________________________________________________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users