also you will still have an error if using the RBNamespace instead the direct 
method invocation, if class does not exist. 
So… I stand with my opinion :)

If you want to control existence, you could do something like this: 

#Model asClassIfPresent: [ :class | 
        class compile: 'asString ^ String empty'  classified: #accessing ]

Esteban

On 18 Jul 2014, at 11:19, Guillermo Polito <guillermopol...@gmail.com> wrote:

> But wait. What happens here is that we are mixing concepts.
> 
> 1) On one side, there is Pharo's class model (the one we program with) => 
> classes, metaclasses, methods. Let's call them the *real* classes and 
> methods. So if you want to add a method to your *real* class, you usually 
> have to
> 
>  - compile a method
>  - add it to the method dictionary of the class
> 
> There are some helper methods that do all the work in one step, as mentioned 
> by Esteban:
> 
> myClass compile: someCode classified: aProtocolName.
> 
> That, is what happens when you use the browser (Nautilus in our case).
> 
> 
> 2) On the other side, there is the Refactoring browser framework (that is, 
> all classes prefixed as RB (except the AST nodes now)). The refactoring 
> browser implements refactorings (renames of classes and methods, pushing 
> up/down instance variables in a hierarchy, extracting methods into classes). 
> Of course, to apply these refactoring it uses the model and API's provided by 
> 1). But it's a completely different monster.
> 
> That means, adding a RBMethod in a RBClass does not mean that you are adding 
> a *real* method into a *real* class. That will not happen unless that change 
> is inside a refactoring and you apply the refactoring.
> 
> 
> 
> On Fri, Jul 18, 2014 at 3:43 AM, Ben Coman <b...@openinworld.com> wrote:
> This might be a good example to add to Deep Into Pharo (but I haven't read it 
> yet, so its too much for me right now to work out where it should go).  
> Anyone interested in doing this? Otherwise maybe I could drop it into a 
> scratchpad at the back of the book.
> cheers -ben
> 
> 
> Hernán Morales Durand wrote:
>> 
>> Yes you need it because when doing code generation you cannot always assume 
>> target class is present. Besides using RB you can confirm through the 
>> NautilusRefactoring which is useful for massive changes:
>> 
>> | model |
>> model := RBNamespace new.
>> (model classNamed: #Model)
>>     compile: 'asString ^ String empty'
>>     classified: #(accessing).
>> (ChangesBrowser changes: model changes changes) openWithSpec 
>> 
>> Cheers,
>> 
>> Hernán
>> 
>> 
>> 2014-07-17 13:55 GMT-03:00 Esteban Lorenzano <esteba...@gmail.com>:
>> Hi,
>> 
>> you do not need the RBNamespace mediation, just do:
>> 
>> Model compile: ‘method ...’ classified: ‘accessing’. 
>> 
>> Esteban
>> 
>> On 17 Jul 2014, at 18:52, Mark Rizun <mri...@gmail.com> wrote:
>> 
>>> Thanks Hernan
>>> 
>>> 17 лип. 2014 18:29, користувач "Hernán Morales Durand" 
>>> <hernan.mora...@gmail.com> написав:
>>> No. Adding a method is not a refactoring. You should use RBAddMethodChange:
>>> 
>>> | model |
>>> model := RBNamespace new.
>>> (model classNamed: #Model)
>>>     compile: 'asString ^ String empty'
>>>     classified: #(accessing).
>>> model changes execute.
>>> 
>>> and the new method is recorded in the .changes file
>>> 
>>> Cheers,
>>> 
>>> Hernán
>>> 
>>> 
>>> 
>>> 2014-07-17 11:08 GMT-03:00 Mark Rizun <mri...@gmail.com>:
>>> Thank you all. Problem is solved, I just used RBAddMethodRefactoring.
>>> 
>>> Mark
>>> 
>>> 
>>> 2014-07-17 16:07 GMT+02:00 Baptiste Quide <baptiste.qu...@inria.fr>:
>>> 
>>> I think you have to add a "RGMethodDefinition" or a "CompiledMethod".
>>> Obviously in a class methodDict the values are CompiledMethod.
>>> 
>>> Regards,
>>> 
>>> De: "Sebastian Tleye" <stl...@gmail.com>
>>> À: "Any question about pharo is welcome" <pharo-users@lists.pharo.org>
>>> Envoyé: Jeudi 17 Juillet 2014 16:03:52
>>> Objet: Re: [Pharo-users] Adding method to class
>>> 
>>> 
>>> I don't know what RBMethod is, but you can do 
>>> 
>>> aClass compile: source.
>>> 
>>> For example: 
>>> 
>>> Array compile: 'newMethod ^ 1'
>>> 
>>> I don't know if it answers your question.
>>> 
>>> Regards
>>> 
>>> 
>>> 
>>> 
>>> 2014-07-17 15:57 GMT+02:00 Mark Rizun <mri...@gmail.com>:
>>> P.S. obviously, my method is added to newMethods var, but it is not 
>>> disblayed in my class.
>>> 
>>> 
>>> 2014-07-17 15:53 GMT+02:00 Mark Rizun <mri...@gmail.com>:
>>> 
>>> Hi guys!
>>> 
>>> How can I add method (I have /RBMethod/) to a class in code?
>>> I'm asking because existing method /addMethod:/ in /RBAbstractClass/ isn't
>>> working.
>>> Here is a piece of my code:
>>> 
>>> /method:= RBMethod for: class source: ('^ ', newName asString) selector:
>>> newName asSymbol.
>>>         class addMethod: getter./
>>> 
>>> Best
>>> Mark
>>> 
>>> 
>>> 
>>> --
>>> View this message in context: 
>>> http://forum.world.st/Adding-method-to-class-tp4768282.html
>>> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 

Reply via email to