You don't need to use structural typing.

Any KeyedMapper has a primaryKey method that returns a Mapped field of the
type of the key.  To get the primary key field of a given KeyedMapper
instance, just call primaryKey.

On Tue, Jan 19, 2010 at 11:55 AM, Ross Mellgren <[email protected]> wrote:

> How about structural typing?
>
> trait Stamped[A <: LongKeyedMapper[A] with { val id: MappedLongIndex[A] }]
> ...
>
> I haven't tried it, but maybe it will work.
>
> -Ross
>
> On Jan 19, 2010, at 2:47 PM, Franz Bettag wrote:
>
> >
> >
> > On 19 Jan., 19:32, David Pollak <[email protected]> wrote:
> >>> i am trying to extend my logging trait. The Problem is, i can't say
> >>> something like A <: LongKeyedMapper[A] in my trait since ProtoUser
> >>> doesn't use IdPK but uses it's own declarations (which look the same
> >>> to me).
> >>
> >> Why do you need ProtoUser extended with IdPK?  Why can't your trait work
> >> with LongKeyedMapper?
> >
> > The code relies on having a .id method on the passed object. The Three
> > Traits are below. It works fine with anything having IdPK. At the
> > moment i have this code copied into my User singleton which is exactly
> > what i want to avoid.
> >
> > I don't know how i would dynamify the use of the .id method. In
> > ActionLog and the Stamped trait.
> >
> > trait Stamped[A <: LongKeyedMapper[A] with IdPK]
> >       extends SkipLogging with KeyedMetaMapper[Long, A] {
> >
> >       self: A with MetaMapper[A] with KeyedMapper[Long, A] =>
> >
> >       override def afterCreate = (crudLog(_: A, "create")) ::
> > super.afterCreate
> >
> >       override def afterUpdate = (crudLog(_: A, "update")) ::
> > super.afterUpdate
> >
> >       override def afterDelete = (crudLog(_: A, "delete")) ::
> > super.afterDelete
> >
> >       private def crudLog(obj: A, action: String): Unit = {
> >               if (!self.skipLogging) {
> >                       val log = new ActionLog
> >
> log.action(action).klass(obj.getClass.getName).record(obj.id).save
> >               }
> >       }
> >
> > }
> >
> >
> > trait SkipLogging {
> >
> >       var skipLogging = false
> > }
> >
> >
> > trait ActionLogs[A <: Mapper[A] with IdPK] {
> >
> >       this: A =>
> >
> >       def logs: List[ActionLog] = ActionLog.findAll(
> >               By(ActionLog.klass, this.getClass.getName),
> >               By(ActionLog.record, this.id)
> >               )
> >
> > }
> >
> >
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> "Lift" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> [email protected]<liftweb%[email protected]>
> .
> > For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=en.
> >
> >
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Lift" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<liftweb%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=en.
>
>
>
>


-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Surf the harmonics
--
You received this message because you are subscribed to the Google Groups "Lift" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.

Reply via email to