RGClassDescriptionDefinition.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 25 Sep 2015 21:56:30 +0100
changeset 6 3e34be6a5d07
parent 5 5cc2caa88b23
permissions -rw-r--r--
Removed dependency on stx:libcompat

"{ Package: 'stx:goodies/ring' }"

"{ NameSpace: Smalltalk }"

RGBehaviorDefinition subclass:#RGClassDescriptionDefinition
	instanceVariableNames:'instanceVariables organization'
	classVariableNames:''
	poolDictionaries:''
	category:'Ring-Core-Kernel'
!

RGClassDescriptionDefinition comment:'RGClassDescriptionDefinition is the common parent for classes and metaclasses defining instance variables'
!


!RGClassDescriptionDefinition methodsFor:'accessing'!

instanceVariables

    ^instanceVariables
!

instanceVariables: aCollection

    instanceVariables:= aCollection
!

organization: aClassOrg
    "Install an instance of ClassOrganizer that represents the organization of the messages of the receiver."

    aClassOrg ifNotNil: [aClassOrg setSubject: self].
    organization := aClassOrg
! !

!RGClassDescriptionDefinition methodsFor:'comparing'!

= aRGClassDefinition

    ^self class = aRGClassDefinition class 
        and: [ self name = aRGClassDefinition name 
            and: [ self environment = aRGClassDefinition environment ] ]
!

hash

    ^self name hash bitXor: self class hash
! !

!RGClassDescriptionDefinition methodsFor:'initialization'!

initialize

    super initialize.
    instanceVariables:= OrderedCollection new.
! !

!RGClassDescriptionDefinition methodsFor:'instance variables'!

addInstVarNamed: aString
    | var |
    var := ((self isMeta 
                ifTrue: [ RGClassInstanceVariableDefinition ]
                ifFalse:[  RGInstanceVariableDefinition ])
        named: aString) parent: self.
    self addVariable: var in: instanceVariables.
    ^var
!

addInstanceVariable: aRGVariableDefinition
    "aRGVariableDefinition is a instance variable or class instance variable"

    self addVariable: (aRGVariableDefinition parent: self)
        in: instanceVariables
!

addInstanceVariables: aCollection
    
    aCollection do: [:var | self addInstVarNamed: var ]
!

allInstVarNames

    ^self allInstanceVariables collect:[ :ivar| ivar name ]
!

allInstanceVariables
    "Answer a collection of the receiver's instanceVariables, including those defined in its superclass"

    ^self hasSuperclass 
        ifFalse:[ instanceVariables ]
        ifTrue:[ self superclass allInstanceVariables, instanceVariables ]
!

instVarNames
    "Answer a collection of the names of the instance variables defined in the receiver."
    
    ^instanceVariables collect:[ :ivar| ivar name ]
!

instanceVariableNamed: aString
    ^ instanceVariables 
        detect: [ :v | v name = aString asSymbol ] 
        ifNone: [ nil ]
!

instanceVariableNames: aStringOrCollection
    | instanceVariableNames |

    aStringOrCollection isString ifTrue:[  
        instanceVariableNames := ((aStringOrCollection tokensBasedOn: Character space) reject:[:e | e isEmpty])
    ] ifFalse:[ 
        instanceVariableNames := aStringOrCollection.
    ].
    instanceVariables := OrderedCollection new.
    self addInstanceVariables: instanceVariableNames

    "Created: / 31-08-2015 / 15:30:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

removeInstVarNamed: aString

    self removeVariable: (self instanceVariableNamed: aString) from: instanceVariables
!

removeInstanceVariable: aRGVariableDefinition
    "aRGVariableDefinition is a instance variable or class instance variable"

    self removeVariable: aRGVariableDefinition from: instanceVariables
! !

!RGClassDescriptionDefinition methodsFor:'organization'!

organization
    "Answer the instance of ClassOrganizer that represents the organization 
    of the messages of the receiver."

    organization ifNil: [
        self organization: (ClassOrganization forClass: self) ].
    "Making sure that subject is set correctly. It should not be necessary."
    organization ifNotNil: [ organization setSubject: self ].
    ^ organization
! !

!RGClassDescriptionDefinition methodsFor:'printing'!

storeOn: aStream
    aStream
        nextPutAll: '(';
        nextPutAll: self class name;
        nextPutAll: ' named: '.
    name storeOn: aStream.
    aStream nextPut: $)
! !

!RGClassDescriptionDefinition methodsFor:'private'!

addVariable: aRGVariableDefinition in: aCollection
    "Adds a RGVariableDefinition in the collection received" 

    aCollection add: aRGVariableDefinition
!

removeVariable: aRGVariableDefinition from: aCollection
    "Removes a variable from a particular collection.
    This behavior is the same for any kind of variable"
    aCollection remove: aRGVariableDefinition ifAbsent:[]
! !

!RGClassDescriptionDefinition methodsFor:'testing'!

isClass

    ^true
!

isSameRevisionAs: aRGClassDescriptionDefinition
    "This method look for equality of the properties of the receiver"
    "Instances variables are compared at the level of names but without any sorting"

    ^(super isSameRevisionAs: aRGClassDescriptionDefinition)
        and:[ self instVarNames sort = aRGClassDescriptionDefinition instVarNames sort ]
! !

!RGClassDescriptionDefinition class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !