/scalate-util/src/main/scala/org/fusesource/scalate/util/ProductReflector.scala

http://github.com/scalate/scalate · Scala · 47 lines · 19 code · 5 blank · 23 comment · 3 complexity · 134013f3d5f8c619abe33251419b1a58 MD5 · raw file

  1. /**
  2. * Copyright (C) 2009-2011 the original author or authors.
  3. * See the notice.md file distributed with this work for additional
  4. * information regarding copyright ownership.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.fusesource.scalate.util
  19. /**
  20. * @version $Revision : 1.1 $
  21. */
  22. object ProductReflector {
  23. /**
  24. * A helper method that uses reflection to find the methods taking no arguments to be able to display the fields in a case class
  25. */
  26. def toMap(obj: AnyRef) = {
  27. val c = obj.getClass
  28. val casemethods = accessorMethods(c)
  29. val values = casemethods.map(_.invoke(obj))
  30. casemethods.map(_.getName).zip(values).foldLeft(Map[String, Any]())(_ + _)
  31. }
  32. def accessorMethods(c: Class[_]) = {
  33. val predefined = List("copy$default$1", "copy$default$2", "curry", "curried", "$tag", "productArity", "productElements", "productIterator", "productPrefix", "hashCode", "toString", "tuple", "tupled")
  34. c.getMethods.toList.filter {
  35. n =>
  36. (n.getParameterTypes.size == 0) &&
  37. (n.getDeclaringClass != classOf[Object]) &&
  38. !predefined.exists(_ == n.getName) &&
  39. !n.getName.matches("_\\d+")
  40. }
  41. }
  42. }