<@script name="AspectFactory" hide="y"> A collection of macros for creating and managing aspect instances Load this file into any program that implements an aspect viewer (e.g., design board, layout board, compiler, etc.) (c) SAP AG 2003-2006. All rights reserved. // GLOBALS var $DOM = {}; // The aspects management object $DOM.allAspects = {}; // The global aspects collection $DOM.currAspect = null; // The aspect currently in scope $DOM.superAspect = null; // The superaspect currently in scope $DOM.currRole = null; // The aspect role currently in scope //////////////////////////////////////////////////////////////////////// // PRIMARY DECLARATIONS <@func name="declareAspect"> Starts an aspect declaration The aspect name The direct super-aspect name, if any The aspect role $DOM.declareAspect = function(aspectName, superAspectName, aspectRole) { try { $DOM.currAspect = null; $DOM.currRole = CLASS(aspectRole); if (!aspectName) throw new Error(-1, 'Aspect name is missing'); if (!$DOM.currRole) $DOM.raiseKitError('Aspect role '+aspectRole+' was not found'); var superAspect=null; if (superAspectName) { superAspect = $DOM.allAspects[superAspectName]; if (!superAspect) throw new Error(-1, 'Super aspect '+superAspectName+' was not found'); } $DOM.superAspect = superAspect; var aspect = new Function('return this.Constructor.apply(this, arguments);'); var aspectdef = CLASS(aspectName); $DOM.allAspects[aspectName] = aspect; aspect.name = aspectName.substring(aspectName.indexOf(':')+1); aspect.fullname = aspectName; aspect.properties = aspectdef.properties; aspect.metadata = aspectdef.metadata; aspect.dollar = $DOM.currRole.dollar; $DOM.currAspect = aspect; aspect.superclass = superAspect; if (superAspect) { aspect.prototype = new superAspect(); } else { var virtual={virtual:true}; $DOM.addMethod('Constructor', $DOM._aspectCstor, virtual); $DOM.addMethod('Destructor', $DOM._aspectDstor, virtual); $DOM.addMethod('isa', $DOM._aspectIsa, virtual); $DOM.addMethod('supercall', $DOM._aspectSupercall, virtual); $DOM.addMethod('toString', $DOM._aspectToString, virtual); } aspect.prototype.constructor = aspect; aspect.prototype.Class = aspect; } catch (e) { $DOM.raiseKitError(e.description); } } <@func name="endDeclaration"> Ends a declaration unit $DOM.endDeclaration = function() { if ($DOM.currAspect && typeof $DOM.currAspect == 'string') $DOM.raiseKitError('Aspect '+$DOM.currAspect+' has no constructor'); $DOM.currAspect = null; $DOM.superAspect = null; $DOM.currRole = null; } //////////////////////////////////////////////////////////////////////// // MEMBER DECLARATIONS <@func name="addConstructor"> Adds a constructor to the current declaration unit The constructor function $DOM.addConstructor = function(cstor) { try { if (!$DOM.currAspect) throw new Error(-1, 'Constructor definition out of scope'); $DOM.addMethod('Constructor', cstor, {virtual:true}); } catch (e) { $DOM.raiseKitError(e.description); } } <@func name="addDestructor"> Adds a destructor to the current declaration unit The destructor function $DOM.addDestructor = function(dstor) { try { if (!$DOM.currAspect) throw new Error(-1, 'Destructor definition out of scope'); $DOM.addMethod('Destructor', dstor, {virtual:true}); } catch (e) { $DOM.raiseKitError(e.description); } } <@func name="addMethod"> Adds a method to the currrent declaration unit The method name The method function The method's modifiers {override, native, sealed, static, and virtual} $DOM.addMethod = function(name, func, modifiers) { try { if (!$DOM.currAspect) throw new Error(-1, 'Method '+name+' definition out of scope'); if (typeof $DOM.currAspect == 'string') return; if (!modifiers || !modifiers.virtual) { // non-virtual methods are delegated to the base object func = new Function('return this.base.'+$DOM.currRole.dollar+'$'+name+'.apply(this.base, arguments);'); } func.name = name; func.Class = $DOM.currAspect; $DOM.currAspect.prototype[name] = func; } catch (e) { $DOM.raiseKitError(e.description); } } <@func name="addProperty"> Adds a property definition to the current declaration unit The property's name The property's data type (boolean|number|string|object|array|pointer|collection|vector). The property's default value. The property's modifiers {override, native, sealed, static, virtual, readonly} $DOM.addProperty = function(name, type, value, modifiers) { try { if (!modifiers || !modifiers.virtual) return; // non-virtual properties are owned by the base object if (!$DOM.currAspect) throw new Error(-1, 'Property '+name+' definition out of scope'); $DOM.currAspect.prototype[name] = value; } catch (e) { $DOM.raiseKitError(e.description); } } <@func name="addMetadata"> Adds a metadata definition to the current declaration unit The metadata name The metadata value $DOM.addMetadata = function(name, value) { } <@func name="addMetadataFor"> Adds a metadata for definition to the current declaration unit The metadata name The metadata value The 'metadata for' modifiers {override} $DOM.addMetadataFor = function(name, value, modifiers) { } //////////////////////////////////////////////////////////////////////// // UTILITIES <@func name="createAspect"> Creates a new aspect object for a specified base object The qualified aspect role name The base object A variable list of arguments to pass to the aspect constructor The new aspect object $DOM.createAspect = function(aspectRole, baseObj, p1, p2, p3, p4, p5, p6, p7) { try { var aspect = baseObj.Class.dependents[aspectRole] || null; var cstor = aspect && $DOM.allAspects[aspect.fullname] || null; if (!cstor) return null; return new cstor(baseObj, p1, p2, p3, p4, p5, p6, p7); } catch (e) { $DOM.raiseKitError('Failed to instantiate '+aspectRole+' aspect for '+baseObj + ' ('+e.description+')'); return null; } } <@func name="getAspect"> Gets the specified aspect class The qualified aspect name The requested aspect class $DOM.getAspect = function(aspectName) { return $DOM.allAspects[aspectName] || null; } <@func name="getAspectOf"> Gets the aspect class attached to a given base object or class under the specified aspect role The base object (or class) The qualified aspect role name The requested aspect class $DOM.getAspectOf = function(baseObj, aspectRole) { try { return $DOM.allAspects[baseObj.Class.dependents[aspectRole].fullname]; } catch (e) { return null; } } <@func name="raiseKitError"> Raises an error message The error message $DOM.raiseKitError = function(error) { if ($DET.hidden) $DET.hidden = false; $DET.showTab('$OUT'); WRITE('ERROR: '+error); PROMPT('Internal error(s) encountered .'); } <@func name="installAspects"> Installs all aspects of a specified aspect role The requested aspect role $DOM.installAspects = function(aspectRole) { var urnlist=[], aspect=CLASS(aspectRole); if (!aspect || !aspect.isAspect) return; appendList(aspect); if (urnlist.length == 0) return; var files=$ENV.channel1.fetchFiles(urnlist); for (var i=0; i