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. >>> >>> >>> >>> >>> >>> >> >> > >