[Lift] Re: Mapper subclasses
I am trying to do what is mentioned below but am struggling with the object side of things for my particular case. This all relates back to trying to auto-generate some classes that I posted back a while ago on. I would love to generate 1 file that has the trait and the object in it that I then inherit from in my sub-class and object sub-class in another file. Autogenerated.scala trait FC[MapperType <: FC[MapperType]] extends Mapper[MapperType] { self: MapperType => object today extends MappedLong(this) } trait FCObj extends FC[MapperType] with LongKeyedMetaMapper[FC [MapperType]] { override def fieldOrder = List(today) } In UserClass.scala class FC_Wrapper extends LongKeyedMapper[FC_Wrapper] with IdPK with FC [Wrapper] { def getSingleton = FCObj_Wrapper // define methods } object FCObj_Wrapper extends FCObj { // define auxiliary functionality } I know that the FCObj and FCObj_Wrapper is not correct syntax wise. But the basic idea is that I want to have my autogeneration generate the boilerplate code for me in a separate file. This boilerplate would ideally include the class and object related stuff. Then in a file that won't be stomped upon the next time I run the generator I inherit from these objects. I hope this makes sense. I admit to not totally understanding the templated/generic programming that is happening. On Sep 3, 1:33 pm, glenn wrote: > Isn't this really a matter of type casting, and asInstanceOf is just > Scala's > way of doing this. It's always best if you don't have to downcast your > objects, but sometimes its unavoidable. > > Glenn... > > On Sep 3, 10:29 am, glenn wrote: > > > I'm not sure of what the exact problem is. I created an Address trait > > that > > I couple with a number of mapper classes. > > > trait Address[OwnerType <: KeyedMapper[Long, OwnerType]]{ > > > def owner = this.asInstanceOf[OwnerType] > > > > > > Where exactly does this construct break down? > > > Glenn... > > > On Sep 3, 7:55 am, Giuseppe Fogliazza wrote: > > > > jon suggested to me the way to avoid both explicit type parameter and > > > asinstance of: > > > trait Timestamp[MapperType <: TimeStamp[MapperType]] extends Mapper > > > [MapperType] { > > >self:MapperType => > > > object xdatetime extends MappedDateTime(this) > > > > // all sorts of utility functions for dealing with timestamps > > > > } > > > > Thanks jon I have improved model in my application with this approach. > > > > Giuseppe > > > > On 3 Set, 16:16, Giuseppe Fogliazza wrote: > > > > > As an alternative to asInstanceOf you could use explicit type > > > > parameter in MappedField creation: > > > >self:MapperType => > > > > object xdatetime extends MappedDateTime[MapperType](this) > > > > > On 3 Set, 09:19, Giuseppe Fogliazza wrote: > > > > > > Unfortunately you cannot escape from asInstanceOf . Forcing > > > > >self:MapperType the type of "this" will be TimeStamp with MapperType > > > > > violating the constraint for the type of the first parameter of > > > > > MappedDateTime :T <: Mapper[T]. > > > > > > Regards > > > > > Giuseppe > > > > > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > > > > > So I guess you can't escape the asInstanceOf. Can you successfully > > > > > > give the trait aself-type of this: MapperType =>, or declare it to > > > > > > extend Mapper[MapperType], without running into problems elsewhere? > > > > > > > - > > > > > > > harryh wrote: > > > > > > > I've been handling this with traits, for example I have something > > > > > > like > > > > > > so: > > > > > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > > > > > object xdatetime extends > > > > > > MappedDateTime[MapperType](this.asInstanceOf > > > > > > [MapperType]) > > > > > > > // all sorts of utility functions for dealing with timestamps > > > > > > > } > > > > > > > Then I can do > > > > > > > class Foo extends LongKeyedMapper[Foo] with IdPK with > > > > > > Timestamp[Foo] { > > > > > > // additional fields that are Foo specific > > > > > > > } > > > > > > > I have quite a few traits similar to Timestamp at this point > > > > > > corresponding to various fields that appear in lots of different > > > > > > tables in my application. > > > > > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
Isn't this really a matter of type casting, and asInstanceOf is just Scala's way of doing this. It's always best if you don't have to downcast your objects, but sometimes its unavoidable. Glenn... On Sep 3, 10:29 am, glenn wrote: > I'm not sure of what the exact problem is. I created an Address trait > that > I couple with a number of mapper classes. > > trait Address[OwnerType <: KeyedMapper[Long, OwnerType]]{ > > def owner = this.asInstanceOf[OwnerType] > > > > Where exactly does this construct break down? > > Glenn... > > On Sep 3, 7:55 am, Giuseppe Fogliazza wrote: > > > jon suggested to me the way to avoid both explicit type parameter and > > asinstance of: > > trait Timestamp[MapperType <: TimeStamp[MapperType]] extends Mapper > > [MapperType] { > > self:MapperType => > > object xdatetime extends MappedDateTime(this) > > > // all sorts of utility functions for dealing with timestamps > > > } > > > Thanks jon I have improved model in my application with this approach. > > > Giuseppe > > > On 3 Set, 16:16, Giuseppe Fogliazza wrote: > > > > As an alternative to asInstanceOf you could use explicit type > > > parameter in MappedField creation: > > > self:MapperType => > > > object xdatetime extends MappedDateTime[MapperType](this) > > > > On 3 Set, 09:19, Giuseppe Fogliazza wrote: > > > > > Unfortunately you cannot escape from asInstanceOf . Forcing > > > > self:MapperType the type of "this" will be TimeStamp with MapperType > > > > violating the constraint for the type of the first parameter of > > > > MappedDateTime :T <: Mapper[T]. > > > > > Regards > > > > Giuseppe > > > > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > > > > So I guess you can't escape the asInstanceOf. Can you successfully > > > > > give the trait a self-type of this: MapperType =>, or declare it to > > > > > extend Mapper[MapperType], without running into problems elsewhere? > > > > > > - > > > > > > harryh wrote: > > > > > > I've been handling this with traits, for example I have something like > > > > > so: > > > > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > > > > object xdatetime extends > > > > > MappedDateTime[MapperType](this.asInstanceOf > > > > > [MapperType]) > > > > > > // all sorts of utility functions for dealing with timestamps > > > > > > } > > > > > > Then I can do > > > > > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > > > > > // additional fields that are Foo specific > > > > > > } > > > > > > I have quite a few traits similar to Timestamp at this point > > > > > corresponding to various fields that appear in lots of different > > > > > tables in my application. > > > > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
I'm not sure of what the exact problem is. I created an Address trait that I couple with a number of mapper classes. trait Address[OwnerType <: KeyedMapper[Long, OwnerType]]{ def owner = this.asInstanceOf[OwnerType] Where exactly does this construct break down? Glenn... On Sep 3, 7:55 am, Giuseppe Fogliazza wrote: > jon suggested to me the way to avoid both explicit type parameter and > asinstance of: > trait Timestamp[MapperType <: TimeStamp[MapperType]] extends Mapper > [MapperType] { > self:MapperType => > object xdatetime extends MappedDateTime(this) > > // all sorts of utility functions for dealing with timestamps > > } > > Thanks jon I have improved model in my application with this approach. > > Giuseppe > > On 3 Set, 16:16, Giuseppe Fogliazza wrote: > > > As an alternative to asInstanceOf you could use explicit type > > parameter in MappedField creation: > > self:MapperType => > > object xdatetime extends MappedDateTime[MapperType](this) > > > On 3 Set, 09:19, Giuseppe Fogliazza wrote: > > > > Unfortunately you cannot escape from asInstanceOf . Forcing > > > self:MapperType the type of "this" will be TimeStamp with MapperType > > > violating the constraint for the type of the first parameter of > > > MappedDateTime :T <: Mapper[T]. > > > > Regards > > > Giuseppe > > > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > > > So I guess you can't escape the asInstanceOf. Can you successfully give > > > > the trait a self-type of this: MapperType =>, or declare it to extend > > > > Mapper[MapperType], without running into problems elsewhere? > > > > > - > > > > > harryh wrote: > > > > > I've been handling this with traits, for example I have something like > > > > so: > > > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > > > object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf > > > > [MapperType]) > > > > > // all sorts of utility functions for dealing with timestamps > > > > > } > > > > > Then I can do > > > > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > > > > // additional fields that are Foo specific > > > > > } > > > > > I have quite a few traits similar to Timestamp at this point > > > > corresponding to various fields that appear in lots of different > > > > tables in my application. > > > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
jon suggested to me the way to avoid both explicit type parameter and asinstance of: trait Timestamp[MapperType <: TimeStamp[MapperType]] extends Mapper [MapperType] { self:MapperType => object xdatetime extends MappedDateTime(this) // all sorts of utility functions for dealing with timestamps } Thanks jon I have improved model in my application with this approach. Giuseppe On 3 Set, 16:16, Giuseppe Fogliazza wrote: > As an alternative to asInstanceOf you could use explicit type > parameter in MappedField creation: > self:MapperType => > object xdatetime extends MappedDateTime[MapperType](this) > > On 3 Set, 09:19, Giuseppe Fogliazza wrote: > > > Unfortunately you cannot escape from asInstanceOf . Forcing > > self:MapperType the type of "this" will be TimeStamp with MapperType > > violating the constraint for the type of the first parameter of > > MappedDateTime :T <: Mapper[T]. > > > Regards > > Giuseppe > > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > > So I guess you can't escape the asInstanceOf. Can you successfully give > > > the trait a self-type of this: MapperType =>, or declare it to extend > > > Mapper[MapperType], without running into problems elsewhere? > > > > - > > > > harryh wrote: > > > > I've been handling this with traits, for example I have something like > > > so: > > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > > object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf > > > [MapperType]) > > > > // all sorts of utility functions for dealing with timestamps > > > > } > > > > Then I can do > > > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > > > // additional fields that are Foo specific > > > > } > > > > I have quite a few traits similar to Timestamp at this point > > > corresponding to various fields that appear in lots of different > > > tables in my application. > > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
You could also do this: trait HasCreated [T <: HasCreated[T]] extends KeyedMapper[Long, T] { self: T => object created_at extends MappedDateTime(this) } //mix into your meta object: trait HasCreatedMetaMapper[T <: HasCreated[T]] { self: T with LongKeyedMetaMapper[T] => import java.util.Date def findByCreated(startDate:Date, endDate:Date) = findAll(By_> (created_at, startDate), By_<(created_at, endDate)) } On Sep 3, 10:16 am, Giuseppe Fogliazza wrote: > As an alternative to asInstanceOf you could use explicit type > parameter in MappedField creation: > self:MapperType => > object xdatetime extends MappedDateTime[MapperType](this) > > On 3 Set, 09:19, Giuseppe Fogliazza wrote: > > > > > Unfortunately you cannot escape from asInstanceOf . Forcing > > self:MapperType the type of "this" will be TimeStamp with MapperType > > violating the constraint for the type of the first parameter of > > MappedDateTime :T <: Mapper[T]. > > > Regards > > Giuseppe > > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > > So I guess you can't escape the asInstanceOf. Can you successfully give > > > the trait a self-type of this: MapperType =>, or declare it to extend > > > Mapper[MapperType], without running into problems elsewhere? > > > > - > > > > harryh wrote: > > > > I've been handling this with traits, for example I have something like > > > so: > > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > > object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf > > > [MapperType]) > > > > // all sorts of utility functions for dealing with timestamps > > > > } > > > > Then I can do > > > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > > > // additional fields that are Foo specific > > > > } > > > > I have quite a few traits similar to Timestamp at this point > > > corresponding to various fields that appear in lots of different > > > tables in my application. > > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
As an alternative to asInstanceOf you could use explicit type parameter in MappedField creation: self:MapperType => object xdatetime extends MappedDateTime[MapperType](this) On 3 Set, 09:19, Giuseppe Fogliazza wrote: > Unfortunately you cannot escape from asInstanceOf . Forcing > self:MapperType the type of "this" will be TimeStamp with MapperType > violating the constraint for the type of the first parameter of > MappedDateTime :T <: Mapper[T]. > > Regards > Giuseppe > > On 3 Set, 07:08, Naftoli Gugenheim wrote: > > > So I guess you can't escape the asInstanceOf. Can you successfully give the > > trait a self-type of this: MapperType =>, or declare it to extend > > Mapper[MapperType], without running into problems elsewhere? > > > - > > > harryh wrote: > > > I've been handling this with traits, for example I have something like > > so: > > > trait Timestamp[MapperType <: Mapper[MapperType]] { > > object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf > > [MapperType]) > > > // all sorts of utility functions for dealing with timestamps > > > } > > > Then I can do > > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > > // additional fields that are Foo specific > > > } > > > I have quite a few traits similar to Timestamp at this point > > corresponding to various fields that appear in lots of different > > tables in my application. > > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
Unfortunately you cannot escape from asInstanceOf . Forcing self:MapperType the type of "this" will be TimeStamp with MapperType violating the constraint for the type of the first parameter of MappedDateTime :T <: Mapper[T]. Regards Giuseppe On 3 Set, 07:08, Naftoli Gugenheim wrote: > So I guess you can't escape the asInstanceOf. Can you successfully give the > trait a self-type of this: MapperType =>, or declare it to extend > Mapper[MapperType], without running into problems elsewhere? > > - > > harryh wrote: > > I've been handling this with traits, for example I have something like > so: > > trait Timestamp[MapperType <: Mapper[MapperType]] { > object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf > [MapperType]) > > // all sorts of utility functions for dealing with timestamps > > } > > Then I can do > > class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { > // additional fields that are Foo specific > > } > > I have quite a few traits similar to Timestamp at this point > corresponding to various fields that appear in lots of different > tables in my application. > > -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
So I guess you can't escape the asInstanceOf. Can you successfully give the trait a self-type of this: MapperType =>, or declare it to extend Mapper[MapperType], without running into problems elsewhere? - harryh wrote: I've been handling this with traits, for example I have something like so: trait Timestamp[MapperType <: Mapper[MapperType]] { object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf [MapperType]) // all sorts of utility functions for dealing with timestamps } Then I can do class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { // additional fields that are Foo specific } I have quite a few traits similar to Timestamp at this point corresponding to various fields that appear in lots of different tables in my application. -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---
[Lift] Re: Mapper subclasses
I've been handling this with traits, for example I have something like so: trait Timestamp[MapperType <: Mapper[MapperType]] { object xdatetime extends MappedDateTime[MapperType](this.asInstanceOf [MapperType]) // all sorts of utility functions for dealing with timestamps } Then I can do class Foo extends LongKeyedMapper[Foo] with IdPK with Timestamp[Foo] { // additional fields that are Foo specific } I have quite a few traits similar to Timestamp at this point corresponding to various fields that appear in lots of different tables in my application. -harryh --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~--~~~~--~~--~--~---