Ah, so the lookups are done once when the method is compiled and then stored
in the CompiledMethod...

My vision is to write something like:
        cannedNow := DateAndTime stub: #now; andReturn: [ DateAndTime year: 2011
month: 12 day: 24 hour: 12 minute: 34 second: 55 ]. 
        testableClass := MyClass usingDouble: cannedNow.

The first line seems easy, and for the second line, I have so far (very
rough, but working): 

        | class copy |
        class := MyClass.
        copy := MyClass copy.

        copy methods do: [ :m | | classRef |
                (m hasLiteralSuchThat: [ :l | ((l isKindOf: Association) and: [ 
l key =
#DateAndTime])])
                        ifTrue: [ | newMeth refIndex |
                                newMeth := copy methodDictionary at: m selector 
put: m copy.
                                refIndex := newMeth indexOfLiteralSuchThat: [ 
:l | ((l isKindOf:
Association) and: [ l key = #DateAndTime])].
                                newMeth literalAt: refIndex put: 
#DateAndTime->MockedClass ] ].
        ^ copy.

Where CompiledMethod>>indexOfLiteralSuchThat: aBlock
        "Answer the literal index of the argument, literal, or zero if none."
        2 to: self numLiterals - 1 "exclude superclass + selector/properties"
           do:
                [:index |
                (aBlock value: (self objectAt: index)) ifTrue: [^index - 1]].
        ^0

Thanks again.
Sean


--
View this message in context: 
http://forum.world.st/Stubbing-class-side-methods-tp3674065p3676637.html
Sent from the Pharo Smalltalk mailing list archive at Nabble.com.

Reply via email to