diff --git a/src/main/scala/Label.scala b/src/main/scala/Label.scala index 7c9b676..080cb25 100644 --- a/src/main/scala/Label.scala +++ b/src/main/scala/Label.scala @@ -6,22 +6,28 @@ trait Label[A] { } object Label { - private[id] def default[A] = new Label[A] { - def label = "" + private val defaultLabel: Label[Nothing] = new Label[Nothing] { + val label = "" } + private[id] def default[A]: Label[A] = defaultLabel.asInstanceOf[Label[A]] + private[id] sealed trait LabelDefinitionConflict + private def nameOf[A](implicit m: Manifest[A]) = { + val typeName = m.toString + typeName.substring(0, typeName.lastIndexOf(".type")) + } + trait MakeLabel { self => // See eidos.id.Format.UUID for an explanation of this // format: off final def `"In Eidos, you can only extend one of MakeLabel or CustomLabel"` : LabelDefinitionConflict = null - implicit final def l(implicit ev: self.type <:< Product): Label[this.type] = - new Label[this.type] { - def label = self.productPrefix - } + implicit final val l: Label[this.type] = new Label[this.type] { + val label: String = nameOf[self.type] + } } trait CustomLabel { @@ -30,10 +36,10 @@ object Label { // format: on def label: String - private def customLabel = label + private val customLabel = label - implicit final def l: Label[this.type] = new Label[this.type] { - def label = customLabel + implicit final val l: Label[this.type] = new Label[this.type] { + val label = customLabel } } } diff --git a/src/test/scala/EidosSpec.scala b/src/test/scala/EidosSpec.scala index ad35423..6733316 100644 --- a/src/test/scala/EidosSpec.scala +++ b/src/test/scala/EidosSpec.scala @@ -83,9 +83,8 @@ class EidosSpec extends Specification with TypecheckMatchers with ScalaCheck { "Tag" should { "be case objects" in { trait Trait - - // MakeLabel is the reason why "case" is required - object Object extends MakeLabel + class Class + object Object type Object = Object.type case object CaseObject @@ -96,6 +95,7 @@ class EidosSpec extends Specification with TypecheckMatchers with ScalaCheck { // format: off { typecheck("""Id.of[Trait]("")""") must failWith(errorMessage("Trait")) } + { typecheck("""Id.of[Class]("")""") must failWith(errorMessage("Class")) } { typecheck("""Id.of[Object]("")""") must failWith(errorMessage("Object")) } { typecheck("""Id.of[CaseObject]("")""") must succeed } // format: on